メールアドレスの書式が正しいかチェックする正規表現

2012-10-18 09:59:04
メールアドレスの書式チェックの方法をネットで調べると、preg_match関数を使用した正規表現チェックのコードがいくつか出てくるのだが、どれも同じコードではない為、どれが一番正確なのかはよく分からない。そこで、信用できそうなコードをご紹介。

どうやら、docomoは「da.me..@docomo.ne.jp」といったRF2822非準拠の携帯メールアドレスが取得できるらしいので、docomoのせいでちょっとややこしいようだ。

↓ドコモのメールアドレスの取得は以下が可能↓
■ドットで始まる
■ドットが連続する
■@の前がドット

あと、こんなメールアドレスも存在するらしい・・・
■Abc\@def@example.com
■customer/department=shipping@example.com
■!def!xyz%abc@example.com

さまざまな状況があるため、メールアドレスの書式チェックは難しいようです。

↓某サイトではこの簡易的なコードを紹介していたが、これでは使えない様子。
<?php
//あくまで簡易的なチェックだというコード
if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)) {
    //正しいメールアドレスかもしれません
}else{
    //正しくないメールアドレスではないかもしれません
}
?>

↓これは正規表現に自信がある人が上記のコードにケチをつけて、ブログで紹介していた正規表現コード。
/^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:"(?:\\[^\r\n]|[^\\"])*")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))$/
参考URL:http://blog.livedoor.jp/dankogai/archives/51189905.html

ながっ!!そしてややこしい!!さすがPHPしかできないプログラマーをコケにしているだけある。尊敬です。

そして、次は何回か挫折したけどもう一度チャレンジしてみたという、頑張り屋さんが紹介したコード。
<?php
//DoCoMoの変メールをカバーしたコード
if(preg_match('/^[-+.\\w]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]{2,6}$/i', $email)){
    //正しいメアド
}else{
    //正しくないメアド
}
?>
参考URL:http://fdays.blogspot.jp/2007/10/rfc-2822-j0hn-d0e-10-pregmatch-9.html

DoCoMoの変メールもOKとしているのでこれが一番実用的なのか?しかし、これでもカバー率は99%だという…。

ちなみに、外人が書き上げた正規表現の書籍には「メールアドレスは正規表現で表すのは不可能」といった内容のことが書かれているみたい。でもそれは、RF2822非準拠のめちゃくちゃなメアドを作る人が悪いので、そんなメアドを対応する必要はないでしょう。従って、上記で紹介したコードで十分でしょう!