メールアドレス判定

かなり使えるPHPの正規表現まとめ - IDEA*IDEA 〜 百式管理人のライフハックブログ 〜
メールアドレスは厳密にチェックしようとするとなかなか難しいのですが、簡単なチェックだったらこれでOKぽいですね。
/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/
全然OKじゃない。

最初の[^0-9]にしてからもうだめ。

メールアドレスの正規表現が一筋縄では行かないことは、ちょっとぐぐればすぐに出てくるし、しかも正規表現でマッチできるのはたかだかnobody@example.com、すなわちaddr-specまでで、From: Anonymous 、すなわちmailboxを正規表現でマッチするのは不可能なのはもう10年以上前から知られている(Perl 5.6以降の拡張正規表現であれば可能だが、それだともう狭義の正規表現からは逸脱してしまう)。

「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ

簡易チェックしたい場合って、主にメールアドレス欄に住所とかが誤入力されたときの対策だと思うので、「正しいメールアドレス」かどうかを判定するよりも、「(グローバル)メールアドレスでないもの」を判定してくれるものが実用的かなと。
そういう点では、addr-specかどうかを判定するより、もっとおバカな表現であってもトップレベルドメインが入ってるかどうかなどを判定してくれたほうが嬉しいと思うけど。
例えばaddr-spec判定だとa@aなんてのでも通るけれども、まあ意味はなさげ。

$text = "mail@mail.com";
if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $text)) {
echo "正しいメールアドレスかもしれません";
} else {
echo "正しくないメールアドレスではないかもしれません";
}

正規表現:メールアドレスかどうか調べる

元々「正しいメールアドレスです」になってたので、その辺が逆鱗に触れたのかもと思うが、どういうものにマッチして、どういうもので誤判定するかってことをきちんと説明できてればOKなのではなかろうか。丸投げするだけだったら書かないほうがよい気がするけど。抜けてる点ということだと、前半の部分だとドットに対する\が不要だしプラスなどが入ってない、後半だと連続するドットがOKとかそういうところだろうか。
ほんとにざっくりだったら^[!-?A-~]+@[\w-]+(\.[\w-]+)+$とかでいい気がするんだけど。しかし範囲表現してしまうとEBCDICで(略)

ところでこの前、教えてもらったメールアドレスがhogehoge...@docomo.ne.jpだったのでアドレスが省略されてると思ってしまった。連続ドットはスパム避けのテクとして定番化されてるんだろうか。
何事もなかったかのように送信できたし返事も来たのでちょっと驚いた。しかもクォートすればRFC的にもvalidだというのでさらに驚いた。