txqz memo

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にそういうクラスがあったのか。件の関数は

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

として実装されていた。