« LinuxWorld Conference & Expo/Tokyo 2007へいってきました | メイン | 株取引はじめました。 »

re: PHPでメールアドレスかどうか調べる方法

はてブotsuneさんやkazuhookuさんがPHPクオリティについて勘違いしていたので、一言申し上げたところ、参考にされた方がいたようで、もうちょっと補足します。

いくつか実装での「正しいメールアドレス」を調べてみました。

phpspot

function is_mail($text) {
if (preg_match('/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$/',$text)) {
return TRUE;
} else {
return FALSE;
}
}



PEAR::Mail_RFC822

    function isValidInetAddress($data, $strict = false)
{
$regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+¥.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|¥'¥¥%¥/0-9a-z^_`{}=?‾:-]+)@(([0-9a-z-]+¥.)+[0-9a-z]{2,})$/i';
if (preg_match($regex, trim($data), $matches)) {
return array($matches[1], $matches[2]);
} else {
return false;
}
}


CakePHP

define('VALID_EMAIL', '/¥¥A(?:^([a-z0-9][a-z0-9_¥¥-¥¥.¥¥+]*)@([a-z0-9][a-z0-9¥¥.¥¥-]{0,63}¥¥.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)¥¥z/i');

Ethna

    function checkMailAddress($mailaddress)
{
if (preg_match('/^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/i',
$mailaddress)) {
return true;
}
return false;

symfony

  public function execute(&$value, &$error)
{
$strict = $this->getParameterHolder()->get('strict');
if ($strict == true)
{
$re = '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i';
}
else
{
/* Cal Henderson: http://iamcal.com/publish/articles/php/parsing_email/pdf/
* The long regular expression below is made by the following code
* fragment:
*
* $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
* $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
* $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'
* . '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
* $quoted_pair = '\\x5c\\x00-\\x7f';
* $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
* $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
* $domain_ref = $atom;
* $sub_domain = "($domain_ref|$domain_literal)";
* $word = "($atom|$quoted_string)";
* $domain = "$sub_domain(\\x2e$sub_domain)*";
* $local_part = "$word(\\x2e$word)*";
* $addr_spec = "$local_part\\x40$domain";
*/

$re = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-'
.'\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-'
.'\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-'
.'\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80'
.'-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29'
.'\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^'
.'\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-'
.'\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-'
.'\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*'
.'\\x5d))*$/'
;
}

if (!preg_match($re, $value))
{
$error = $this->getParameterHolder()->get('email_error');
return false;
}

$checkDomain = $this->getParameterHolder()->get('check_domain');
if ($checkDomain && function_exists('checkdnsrr'))
{
$tokens = explode('@', $value);
if (!checkdnsrr($tokens[1], 'MX') && !checkdnsrr($tokens[1], 'A'))
{
$error = $this->getParameterHolder()->get('email_error');

return false;
}
}

return true;
}

結論。DNS引いてドメインの有効性チェックまでやるsymfonyはヤリ過ぎ。EthnaかPEAR、symfonyのstrictでないものが現実的な線かと思います。CakePHPはpresident@usa.govがNGになる。NGではありませんでした。ごめんよ、ジョージ。君のメールアドレスもラスベガス産のフレームワークは変な書き方だけど受け入れてくれるよ。




トラックバック

このエントリーのトラックバックURL:
http://catbot.net/MTOS4/mt-tb.cgi/161

この一覧は、次のエントリーを参照しています: re: PHPでメールアドレスかどうか調べる方法:

» ラスベガス 送信元 ラスベガス
うーむ… [続きを読む]

» phpspotの人は正規表現について語らないほうがいいのでは 送信元 秋元@サイボウズラボ・プログラマー・ブログ
「実用的なPHP用の正規表現x8」というphpspot開発日誌という記事で、 8... [続きを読む]

» 【No.2】メールアドレスチェック - Zend Validateの派生クラスをいくつか公開します 送信元 携帯サイトをつくろう。
「携帯サイト制作には欠かせないデータ入力チェック『Zend Validate』の派生クラスを公開します」の2つ目としてメールアドレスの形式をチェックするクラスを公開します。 メールアドレス... [続きを読む]

» re: PHP でメールアドレスかどうか調べる方法 送信元
re: PHP でメールアドレスかどうか調べる方法 [続きを読む]

» バッグ サイト 送信元 バッグ サイト
財布 値段 [続きを読む]

» 財布 kate spade 送信元 財布 kate spade
クロックス 店舗 [続きを読む]

» crocs 偽物 送信元 crocs 偽物
財布 kate spade [続きを読む]

» モンクレール ジャケット 送信元 モンクレール ジャケット
crocs 店舗 [続きを読む]

» ダウン duvetica 送信元 ダウン duvetica
クロックス マンモス [続きを読む]

» crocs セール 送信元 crocs セール
ジャケット 価格 [続きを読む]

» クロックス 種類 送信元 クロックス 種類
ダウン ロング [続きを読む]

» クロックス レディース 送信元 クロックス レディース
クロックス 価格 [続きを読む]

» コート ロング 送信元 コート ロング
クロックス 人気 [続きを読む]

» クロックス crocs 送信元 クロックス crocs
クロックス 色 [続きを読む]

» ダウン 人気 レディース 送信元 ダウン 人気 レディース
クロックス マリンディ [続きを読む]

» moncler レディース 送信元 moncler レディース
moncler ダウン レディース [続きを読む]

» crocs 靴 送信元 crocs 靴
靴 通販 激安 [続きを読む]

» ジャケット ブランド 送信元 ジャケット ブランド
メンズ モンクレール [続きを読む]

» 楽天 ジャケット 送信元 楽天 ジャケット
モンクレー 店舗 [続きを読む]

» モンクレー ジャケット 送信元 モンクレー ジャケット
crocs usa [続きを読む]

» 12502;& 送信元 12502;&
re: PHPでメールアドレスかどうか調べる方法 (ハズレ日記) [続きを読む]

コメント (1)

?:

友人のソフトバンク携帯メールアドレスは
?hogehoge@
みたいに、?で始まるのだが、弾かれる可能性がある。
そもそも?ではじまるのっていいの?って意見もあるからむずかしい。