PHPでメールアドレスが正しい形式かチェックしたいことってありますよね?
例えばフォームから送信されたメルアドが正しい形式かどうか確認したい場合とか
その場合PHPでは2つの方法でチェック可能なので、そのやり方を紹介します。
メルアドの形式チェックを行う2つの方法
そのチェック方法とは次の2つ
- 正規表現を使ってチェック
- filter_var関数を使ってチェック
この2つのやり方は次の通り
正規表現でメルアドチェック
まず初めは正規表現を使ったメルアドのチェック方法
PHPなら preg_match にパターンを渡せば簡単にチェックができます。
ただし正規表現については情報が錯乱しているので、使うことをおススメしません。
ですがこういう方法もあることを示すために一応やり方を説明します。
まずどうすればメルアドにマッチする正規表現になるのか?
ということですが、厳密なことを考えずに正規表現を書くと次のような感じ
1 |
^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$ |
これは実際にHTML5の input[type=email] で使われる正規表現のようです。
そしてこれはメルアドの規格であるRFC5322に意図的に違反しています。
もちろん厳密な正規表現も書けますが、書こうとするとめちゃくちゃ長くなります。
なので正規表現はメルアドのチェックを行うには基本的に不向きだと考えてください。
それでこの正規表現でメルアドのチェックをしているのが次のコード
1 2 3 4 5 6 7 8 9 10 |
/** 形式チェックしたいメールアドレス */ $email = 'hogehoge@gmail.com'; /** 形式チェックに使う正規表現 */ $pattern = "/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/"; if( preg_match($pattern, $email ) ){ print_r("'$email'は正しい形式のメールアドレス"); }else{ print_r("'$email'は不正な形式のメールアドレス"); } |
なんかそれらしいですが、動作については一切保証できません。
簡単な正規表現ではチェックしきれないほどメルアドの規格は複雑ってことです。
以上が形式チェックを正規表現で行う方法
ですが自前で下手な正規表現は使わない方がいいと思います。
filter_var関数でメルアドチェック
お次は値をフィルタリングする関数 filter_var を使ってチェックする方法
この関数は次のようにチェックデータ $data 、フィルタ形式 $filter を渡して使います。
1 |
$filtered_data = filter_var( $data, $filter ); |
返り値 $filtered_data についてですが、
- フィルタ形式に当てはまるならフィルタリングされたデータ
- 不正または正しくない形式のデータなら FALSE
という値が返ってきます。
返り値が FALSE かどうかで正しいか正しくないかが判断できるという訳です。
そしてメルアドチェックをする場合はフィルタ形式に FILTER_VALIDATE_EMAIL を渡せばOKです。
例えば次がメルアドチェックしているコード例
1 2 3 4 5 6 7 8 |
/** チェックしたいメールアドレス */ $email = 'hogehoge@gmail.com'; if( filter_var( $email, FILTER_VALIDATE_EMAIL ) ){ print_r("'$email'は正しい形式のメールアドレス"); }else{ print_r("'$email'は不正な形式のメールアドレス"); } |
上のコードでは正しい形式のメルアドだと判断されます。
こっちを使う方が下手に自前の正規表現を使うよりも確実でスマートかもしれません。
ただし FILTER_VALIDATE_EMAIL は次を含むメルアドはサポートしてないようです。
- コメントを含むメルアド
- 空白が折りたたまれたメルアド
- ドットのないドメイン名
コメントと空白については良く分からないですが、トップレベルドメイン自体にIPが割り振られるドットレスドメインには未対応の模様
以上がfilter_var関数を使ったメルアドチェックの方法です。
PHPで正式にサポートされているならこっちを使う方が確実(かもしれない)と思います。
補足 : IPアドレスやURLを形式チェックするには・・
ここまででメルアドの形式チェック方法について紹介してきました。
PHPなら正規表現をゴリゴリ書くよりfilter_var関数でチェックする方が簡単だと思います。
ちなみにfilter_var関数ではIPアドレスやURLの形式チェックも可能です。
詳しいやり方やコード例は次記事で解説した通り
フォーム入力などでチェックが必要な時に使えるかもしれません。
ここまでのまとめ
ということでもう一度メルアドのチェック方法についてまとめ
- 正規表現でメルアドチェック
当てはまるパターンを preg_match に渡して判定する
ただしメルアド規格は複雑なので自前で正規表現を作るのは危険 - filter_var関数でメルアドチェック
この関数に FILTER_VALIDATE_EMAIL を渡せば判定できる
いくつか例外はあるものの、正規表現を使うよりはこっちの方が確実
ネット上には正規表現を使う方法が紹介されてますが、鵜呑みにしない方がいいと思います。
PHPだけでメルアドチェックするならfilter_var関数を使うのが一番確実です。