Home > PHP > メールアドレスを正規表現で判定する方法

メールアドレスを正規表現で判定する方法

  • Posted by: zaru
  • 2007年4月16日 10:35
  • PHP

WEBプログラムを作っていると、たびたび出てくるメールアドレス入力フォーム。そのメールアドレスが正しいかどうか判定する方法。

Perlの場合

if($email =~ /^[^@]+@[^.]+\..+/){
	print '正しいかも';
}else{
	print '違うかも';
}

本当に簡易バージョン。Perlメモさんのページにあるように、RFCに準拠したメールアドレスの正規表現を作るのは難しいです。どうしても正しいメールアドレスかどうか判定したいという人は、CPANのモジュール Email::ValidMail::CheckUserを使うほうが吉。

両者ともメールアドレスが実在するかどうか問い合わせてくれるので、判定レベルがぐっと上がる。問い合わせ方法は、Email::Validはメールアドレスのドメインが実在するかの確認。Mail::CheckUserはメールサーバに接続して、そのユーザが存在するか確認する。

PHPの場合

PHPでは、Perlと互換性のある正規表現が使えるので、上記の簡易正規表現判定も使えます。ただ、完全に判定はしなくてもいいが、もう少し厳しく判定したいという人は以下のものがオススメ。

$match = '^[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+'
	.'@[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+\.'
	.'(af|al|dz|as|ad|ao|ai|aq|ag|ar|am|aw|ac|au|at|az|bh|bd|bb|by|bj|bm|bt|bo|ba|bw|br|io|bn|bg|bf|bi|kh|cm|ca|cv|cf|td|gg|je|cl|cn|cx|cc|co|km|cg|cd|ck|cr|ci|hr|cu|cy|cz|dk|dj|dm|do|tp|ec|eg|sv|gq|er|ee|et|fk|fo|fj|fi|fr|gf|pf|tf|fx|ga|gm|ge|de|gh|gi|gd|gp|gu|gt|gn|gw|gy|ht|hm|hn|hk|hu|is|in|id|ir|iq|ie|im|il|it|jm|jo|kz|ke|ki|kp|kr|kw|kg|la|lv|lb|ls|lr|ly|li|lt|lu|mo|mk|mg|mw|my|mv|ml|mt|mh|mq|mr|mu|yt|mx|fm|md|mc|mn|ms|ma|mz|mm|na|nr|np|nl|an|nc|nz|ni|ne|ng|nu|nf|mp|no|om|pk|pw|pa|pg|py|pe|ph|pn|pl|pt|pr|qa|re|ro|ru|rw|kn|lc|vc|ws|sm|st|sa|sn|sc|sl|sg|sk|si|sb|so|za|gs|es|lk|sh|pm|sd|sr|sj|sz|se|ch|sy|tw|tj|tz|th|bs|ky|tg|tk|to|tt|tn|tr|tm|tc|tv|ug|ua|ae|uk|us|um|uy|uz|vu|va|ve|vn|vg|vi|wf|eh|ye|yu|zm|zw|com|net|org|gov|edu|int|mil|biz|info|name|pro|jp)$';

if(preg_match("/$match/",$email)){
	print '正しいかも';
}else{
	print '違うかも';
}

文字の判定を加えて、さらにトップレベルドメインで判定をしている。デメリットとしてはトップレベルドメインが増えたり減ったりしたときに大変。ereg() でも使用できるが、preg_match() の方がじゃっかん高速。もちろんPerlでも使用できる。

JavaScriptの場合

JavaScriptでももちろん正規表現が使える。

mail = document.getElementById("email").value;
if(mail.match(/^[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+@[0-9,A-Z,a-z][0-9,a-z,A-Z,_,\.,-]+\.(af|al|dz|as|ad|ao|ai|aq|ag|ar|am|aw|ac|au|at|az|bh|bd|bb|by|bj|bm|bt|bo|ba|bw|br|io|bn|bg|bf|bi|kh|cm|ca|cv|cf|td|gg|je|cl|cn|cx|cc|co|km|cg|cd|ck|cr|ci|hr|cu|cy|cz|dk|dj|dm|do|tp|ec|eg|sv|gq|er|ee|et|fk|fo|fj|fi|fr|gf|pf|tf|fx|ga|gm|ge|de|gh|gi|gd|gp|gu|gt|gn|gw|gy|ht|hm|hn|hk|hu|is|in|id|ir|iq|ie|im|il|it|jm|jo|kz|ke|ki|kp|kr|kw|kg|la|lv|lb|ls|lr|ly|li|lt|lu|mo|mk|mg|mw|my|mv|ml|mt|mh|mq|mr|mu|yt|mx|fm|md|mc|mn|ms|ma|mz|mm|na|nr|np|nl|an|nc|nz|ni|ne|ng|nu|nf|mp|no|om|pk|pw|pa|pg|py|pe|ph|pn|pl|pt|pr|qa|re|ro|ru|rw|kn|lc|vc|ws|sm|st|sa|sn|sc|sl|sg|sk|si|sb|so|za|gs|es|lk|sh|pm|sd|sr|sj|sz|se|ch|sy|tw|tj|tz|th|bs|ky|tg|tk|to|tt|tn|tr|tm|tc|tv|ug|ua|ae|uk|us|um|uy|uz|vu|va|ve|vn|vg|vi|wf|eh|ye|yu|zm|zw|com|net|org|gov|edu|int|mil|biz|info|name|pro|jp)$/i)){
	alert("正しいかも");
}else{
	alert("違うかも");
}

Comments:2

yu-g 2007年4月21日 01:26

ある文字列の中からメールアドレスだけを抽出する方法を調べていて、こちらを見つけました。
トップレベルドメインで判定するアイディアを参考にさせていただきましたが、気付いた点が一つあります。
この正規表現だと.comや.netのアドレスを、.coや.neとしてマッチしてしまいます。
トップレベルドメインは、文字数の多いものから左から順に並べないと正しく判定できません。

yu-g 2007年4月21日 01:32

あ、失敬。末尾に$が付いてる場合はこれでokですね。
僕の使い方が、^と$を外して文字列中から抽出していたもので・・・

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://blog.tofu-kun.org/mt-tb.cgi/307
Listed below are links to weblogs that reference
メールアドレスを正規表現で判定する方法 from Webプログラマー+WebデザイナーなZARU日記

Home > PHP > メールアドレスを正規表現で判定する方法

Profile

zaru

Name : zaru

Webプログラマ+Webデザイナで、Webディレクタやってます。Twitterやっているので、ぜひフォローしてやってくださいませ。Twitter - zaru。また、そのほかのプロフィールについては、iddy - zaruを見てください。

Search
Feeds
Others

Return to page top