【PHP】メール形式チェックの手段


複数メールアドレスを格納している配列に、個々メールアドレスのチェックを例として説明します。

CakePHPのデータバリデーションによるメールチェック

sample1
/**
* 厳密なチェック1 
*   無効パターン:
*     @の前にドットがある(.@)
*     ドットが連続している(…)
*     
* ※回避方法はページ下部の[CakeEmailのメールアドレスチェックを回避する]にご参考
*  
*/
use Cake\Validation\Validator;
use Cake\Validation\Validation;

$validator = new Validator ();
$validator
->allowEmpty ( 'mails' )
->add ( 'mails', [
    'mail' => [
        'rule' => function ($value, $context) {
            foreach ( $value as $mail ) {
                if (Validation::email ( $mail ) == false) {
                    return false;
                }
                return true;
            },
        'message' => 'メールアドレス形式不正。'
    ],
] );


PHPのフィルターによるメールチェック

sample2
/**
* 厳密なチェック2 
* 
*   e-mail アドレスが RFC 822 に沿った形式であるかどうかを確かめます。
*   ただし、
*     コメント、空白の折り返しおよび ドットなしドメイン名には対応していません。
*     [参考](http://php.net/manual/ja/filter.filters.validate.php)
*/

use Cake\Validation\Validator;

$validator = new Validator ();
$validator
->allowEmpty ( 'mails' )
->add ( 'mails', [
    'mail' => [
        'rule' => function ($value, $context) {
            foreach ( $value as $mail ) {
                if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) { // RFC 822 形式基準
                    return false;
                }
                return true;
            },
        'message' => 'メールアドレス形式不正。'
    ],
] );

PHPの正規表現によるメールチェック

ある程度のかなり緩めのチェックをほしいとしたら、正規表現という手段にもあります。

sample3
/**
* 緩めのチェック3 
* 
*   e-mail アドレスが「半角文字(記号混在可)@半角文字(記号混在可)」というような形式であるかどうか。
*   
*/

use Cake\Validation\Validator;
$validator = new Validator ();
$validator
->allowEmpty ( 'mails' )
->add ( 'mails', [
    'mail' => [
        'rule' => function ($value, $context) {
            foreach ( $value as $mail ) {
                if (! preg_match ( '/^[!-~]+@[!-~]+$/', $mail )) { // 形式:半角文字(記号混在可)@半角文字(記号混在可)
                    return false;
                    }
                }
                return true;
            },
        'message' => 'メールアドレス形式不正。'
    ],
] );

参考
PHP-検証フィルタ
メールアドレスのバリデートはどっちが正しいの?
CakeEmailのメールアドレスチェックを回避する

---I Love PHP (。・ω・。)ノ♡