がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

emailアドレスのvalidate

「存在確認じゃなくて」validate、のお話。
いや実際色々と困るのよねぇ、っと。
ググると「明らかに間違った正規表現がTopに出てくる」とかしゃれならん状況もありますし B-p*1
とりあえずPHP用の想定でお話しますが、多分、他の言語でも通用する一般的な話になるんじゃないかなぁ、っと。


おいちゃんは基本「存在確認しなさいよ」派なので、validateは結構雑です。
雑なのを前提で。


あと、初手で暴言吐いておくと。
「別に正規表現一本で解決、にこだわらなくてもいいじゃん」とか思うのよ。そも正規表現って重いじゃん?
正規表現書くくらいなら「自力でオートマトン書こうよ」とか思っちゃう口だしねぇ正直 B-p


なんでまぁ、多分、そこいらのサイトとは大分論調が異なると思われますんで、予めそこんとこ夜露死苦*2


先に番外編から

filter_var()でFILTER_VALIDATE_EMAILを使ってチェックする

えぇまぁかなり綺麗にチェックしてくれるので。
例えば「 名前<めあど> 」なんてケースの時の<>の中身だけ抜き出してからこの子でチェックすると「大変に美しい」チェックをしてくれます。
どこぞの某携帯会社の「RFC無視なメアド」を切り捨てていいんなら、選択肢じゃないかなぁw
…いやマジで、個人的なサービスで、いくつかは使いたい気がせんでもないぶっちゃけ。


とはいえまぁそうも言ってられないケースが多いだろうから。
荒っぽいのから、少しずつ丁寧にいきます。
あ。「 名前<めあど> 」の形式は外せて、メアドだけむき身に出来てる前提で*3

domain-partはvalidate、local-partは未チェック

domainは割とチェックしやすいんで、ちゃんと「RFCに沿った」フォーマット&文字種である事をチェック。
local-partは「文字があればいいじゃん」程度のチェック…それをチェックと呼ぶのなら(笑)。
なお。「local-partに@が使える」事をちゃんと考慮してロジック組みませう。
超雑には、こんな感じ。

//$email = 'hoge@domain.com';
$email = '"hoge@hoge"@domain.com';
$awk = explode('@', $email);
$domain_part = array_pop($awk);
$local_part = implode('@', $awk);
//
var_dump($local_part);
var_dump($domain_part);

このレベルくらいなら「空メール打って存在確認」系の時にも、その手前の「簡単なvalidate」として、組んでいいんじゃないかなぁ? って思うのだよね。


ちなみに余談の「domainのチェック方法」。
色々出てるような出てないような怪しい情報ばかり出てるような気がするんだけど。
ウルトラおおざっぱに判定するんなら
・domain文字列の左端( [0] )は、a-zまたはA-Zであること
・domain文字列の右端( [strlen - 1] )は、a-zまたはA-Zまたは0-9であること
・domain文字列は、a-zとA-Zと0-9とハイフン(-)とピリオド (.)で構成されていること
・ピリオド (.)が二つ繋がってないこと
くらいで判定すりゃいいと思う(日本語ドメイン? なにそれ美味しい?)。実際、このまんまのコードで書けばとりあえずいける。
…今度、MagicWeaponで、オートマトン組んどこうかなぁ?


あと。昔って「@以降がIPアドレス」でも行けたと記憶しているんだけど、同じくらい「割と最近のどこかで、なんか嫌がられた」記憶もあるんだよねぇ…その辺面倒なんで未調査なんだが、どうなんだろ?
OKであることを仮定すると、ドメインじゃない場合「IPアドレスかどうか」って判定をしてもいいと思う。
それこそ filter_var() で一撃でいけるしね。

domain-partの「トップレベルドメイン」くらいは確認する

割と簡単にできるしねぇ。ただ「一覧の保持とメンテ」が幾分面倒なのかな?
…ただ「細かいメンテが必要か?」と聞かれると、大抵のサービスでは「細かくメンテせんでもどーにかなる」だろうからなぁ、という、困った側面(笑
一応「丁寧にメンテしましょう」って言うだけは言っておくよw

domain-partのMXを確認

getmxrr()とかいうのがさりげなく標準でいらっしゃるので。
確認したきゃ、それもいいんじゃないかなぁ? っと。
おいちゃんは「そこまでやるんなら存在確認しなさいよ」って思うけどさ、まぁ一応。
ちなみに「MXがない」場合は gethostbyname() で、Aレコードを確認。「MXもAもどっちからも引けない」と、いささか、メアドのドメインとしては「どーなのよ?」ってなると思う。


ん……………正直、これくらい?
local-part、RFCは「複雑怪奇」だし現実は「魑魅魍魎」なので、正直「文字があればいいぢゃん」程度にしか、思えないんだよねぇ(苦笑


まぁ「一つの考え方」くらいにみていただければ、と思いまする。
突っ込みは歓迎しますんで、是非、コメント欄まで。

*1: 突っ込まれてもなおマトモに修正できないんじゃ、色々と末だよねぇ、っとB-p

*2:…死語レベルで古い表記だなぁw

*3: MagicWeaponのほうではその関数あるしねぇ(笑