PHPサンプル
UPDATE:2017年06月14日
PHP 正規表現 で メールアドレスを判定(チェック)したい
正規表現 メールアドレスの判定「preg_match()」
一致は 1、不一致は 0 = preg_match(正規表現の文字列, 検索する文字列, [検索結果の配列]);
//[検索結果の配列]は省略可能です。
//[検索結果の配列]は省略可能です。
PHPバージョン | PHP4 PHP5 PHP7 |
---|---|
動作 | preg_match()関数は、【パターン化された文字列=正規表現】で【文字列】を検索します。検索で一致すれば数字の 1 を返し、不一致の場合は数字の 0 を返します。エラーの場合は、FALSE を返します。 |
正規表現の文字列 | 正規表現の文字列を "((シングルクォート=引用符) ) や '(ダブルクォート=二重引用符) で囲みます。さらに内側を デリミタ(スラッシュやシャープなどが利用可能)で囲みます。 "/正規表現/" '/正規表現/' |
検索する文字列 | 正規表現で検索したい文字列を指定します。 |
検索結果の配列 | 配列に $matches と指定した場合、正規表現パターンマッチした文字列が代入されます。どの文字列が正規表現パターンにマッチしたのか確認することが出来ます。 |
返り値 | 一致の場合 1 、不一致の場合 0 、エラーの場合 論理値 FALSE |
メールアドレスの書式が正しいかどうか判定する正規表現です。
参考サイト:Email Address Regular Expression That 99.99% Works.
99.99%のメールアドレスを判定できる正規表現です。(RFC5322に準拠)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <!-- サンプルコード --> <?php $mail = 'info@wepicks.net'; if(preg_match('/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD', $mail)){ list($username,$domain) = explode('@',$mail); if(!checkdnsrr($domain,'MX')){ echo "不正なメールアドレス\n"; }else{ echo "正しいメールアドレス\n"; } }else{ echo "不正なメールアドレス<br>\n"; } ?> |
結果は
正しいメールアドレス
となります。
厳密にメールアドレスの妥当性をチェックする正規表現を作成すると本1冊分程度になるという話を耳にしたことがあります。
実際のウェブサービスでは、「仮登録 → ユーザーがウェブサイトから確認メール受信 → メールのURLから本登録」という手順を行い、メールが正しいか判断するのが基本です。
入力項目では正規表現によるフィルタリングでXSS等の悪意ある入力を弾くようにすればよいと思います。
どの程度の厳密さを求めるかは開発者に依存します。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <!-- サンプルコード --> <h3>正規表現 メールアドレスの判定</h3> <?php //通常版 $sMailaddress = 'info@wepicks.net'; if(preg_match('/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD', $sMailaddress)){ list($username,$domain)=explode('@',$sMailaddress); if(!checkdnsrr($domain,'MX')){ echo "不正なメールアドレスです。<br>\n"; }else{ echo "正しいメールアドレスです。<br>\n"; } }else{ echo "不正なメールアドレスです。<br>\n"; } ?> <h3>正規表現 メールアドレスの判定 関数版</h3> <?php //関数版 function CheckEmailAddress($sMailaddress) { if(preg_match('/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD', $sMailaddress)){ list($username,$domain)=explode('@',$sMailaddress); if(!checkdnsrr($domain,'MX')){ return false; } return true; } return false; } //関数実行 $sMailaddress = 'info@wepicks.net'; if(CheckEmailAddress($sMailaddress)){ echo "正しいメールアドレスです。<br>\n"; }else{ echo "不正なメールアドレスです。<br>\n"; } ?> |
実行結果
正規表現 メールアドレスの判定
正しいメールアドレスです。
正しいメールアドレスです。
正規表現 メールアドレスの判定 関数版
正しいメールアドレスです。
タグ(=記事関連ワード)
日付
投稿日:2017年4月15日
最終更新日:2017年06月14日
最終更新日:2017年06月14日
このカテゴリの他のページ
この記事へのコメント
トラックバックurl
https://wepicks.net/phpsample-preg-mail/trackback/