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

Otsuneのtwitter経由でphpspotがオススメするメールアドレスの正規表現。8:2ルールを採用したような簡便な正規表現にはてブのコメント欄が賑わっている。

ていうか「メールアドレス」「正規表現」でぐぐる最初に出てくるリソースに、思いっきりメールアドレスに一致する正規表現は「ありません」なんてあって、その下に条件付きの鬼のような正規表現が紹介されている。メールアドレスの闇は深い。ヘタに触れると火傷する。

一応正確なアドレスを弾かずに、「なるべく」おかしなアドレスを弾く正規表現として

$d3     = '\d{1,3}';
$ip     = join('\.', ($d3) x 4);
$ascii  = '[\x01-\x7F]';
$domain = '([-a-z0-9]+\.)*[a-z]+';
$mailre = "^$ascii+\@($domain|\\[$ip\\])$";

# $mailre = '^[\x01-\x7F]+@(([-a-z0-9]+\.)*[a-z]+|\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])';

が紹介されていた。

あと、はてブでid:shomaさんがMail_RFC822::isValidInetAddress()使おうよ..と言っていた。PEARにそういうクラスがあったのか。件の関数は

    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;
        }
    }

として実装されていた。

タグ
© 2001-2008 Chisa YOUZAKA. Some rights reserved.