phpで文字列がメールアドレスかどうか調べる。
<?php filter_var('takuya@example.com', FILTER_VALIDATE_EMAIL ))
たったこれだけでRFC準拠のE-MAILのメールアドレスかどうかを調べることができる。
その他の出力結果はつぎのようになります。
php > var_dump(filter_var('takuya@example.com', FILTER_VALIDATE_EMAIL )); string(18) "takuya@example.com" php > var_dump(filter_var('takuya+sample@example.com', FILTER_VALIDATE_EMAIL )); string(25) "takuya+sample@example.com" php > var_dump(filter_var('takuya+sample@.com', FILTER_VALIDATE_EMAIL )); bool(false) php > var_dump(filter_var('takuya+sample@doc.com', FILTER_VALIDATE_EMAIL )); string(21) "takuya+sample@doc.com" php > var_dump(filter_var('takuya.@doc.com', FILTER_VALIDATE_EMAIL )); bool(false) php > var_dump(filter_var('takuya_1st@doc.com', FILTER_VALIDATE_EMAIL )); string(18) "takuya_1st@doc.com" php > var_dump(filter_var('tak.uya_1st@doc.com', FILTER_VALIDATE_EMAIL )); string(19) "tak.uya_1st@doc.com" php > var_dump(filter_var('tak..uya_1st@doc.com', FILTER_VALIDATE_EMAIL )); bool(false)
RFC非準拠メールアドレスを捨てても大丈夫。
むかしむかし、NTTドコモというメールアドレス発行者がいて、RFC非準拠メールアドレスを発行許可してくれました。 dd.@docomo.ne.jp
のように@マークの前に ドットが入るものです。しかし現在では、ドコモのメールアドレスでは、@マーク前のドットは許可されされていません。スパムメール対策に敢えて準拠違反のメールアドレスを使うという暴挙が過去に行われていましたが、いまは昔です。
Gmailでは ta..ku..ya@gmail.com
のような ドットが連続するメールアドレスを使えましたが、これもいまは昔です。もう動きません。
したがって、Phperが「妙ちくりん」なregular expression を書いたりコピペするよりも、FILTER_VALIDATE_EMAIL を使ってメールアドレスをバリデーションしたほうが確実なのです。
なぜしないんでしょうね。コピペが横行していて、公式マニュアルを読まないのは少し不思議(SF)です。
メールアドレスのバリデーションは公式をまず使おう
php 組み込み関数 filter_var を使うほうが無難です。それでもどうしても対応できないものが出てきた時に、はじめてコピペや検索結果に出てくるアドバイスを見たらどうでしょうか。
<?php filter_var('takuya@example.com', FILTER_VALIDATE_EMAIL ))
filter_vars に関するバリデーション一覧
https://www.php.net/manual/en/filter.filters.validate.php
マニュアルを少し見れば、変な正規表現パターンもテストも不要になるのではないでしょうか。