Webサービスやアプリを開発して運営するのが趣味です。



WebKit の email バリデーション

2013年04月10日 23:10
/[a-z0-9!#%&$'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\\.[a-z0-9-]+)*/i

HTML5ではinputタグのtype属性でemailを指定できるようになっていて、メアドっぽくない文字列が入ってたらフォームの送信ができなくなる。JavaScriptでバリデーション書く必要なくなるからどんどん使っていきたいんだけど、結局サーバー側のバリデーションは必要になります。しかもメールアドレスのバリデーションといったら攻略不可能な人類永遠の課題です。時間使って考えたくない。というかクライアントサイドでemailバリデーション使うなら、サーバーサイドも同じパターンを使うのが筋だと思った。WebKitのソースからメールアドレスのバリデーションを行っているコードを探してみましょう。

WebKitはオープンソースなので公式サイトに載ってるレポジトリからcheckoutできるし、非公式Githubレポジトリからcloneすることもできる。ソース見るだけなら後者のほうが便利。

git clone --depth=1 git://github.com/WebKit/webkit.git
cd webkit
git grep email

として検索すると候補が幾つか出てくるので、眺めてみるとターゲットの正規表現が Source/WebCore/html/EmailInputType.cpp にいることがわかる。

EmailInputType.cpp

static const char emailPattern[] =
    "[a-z0-9!#$%&'*+/=?^_`{|}~.-]+" // local part
    "@"
    "[a-z0-9-]+(\\.[a-z0-9-]+)*"; // domain part

これっぽい。合体させてスラッシュをエスケープすると一番最初に書いたやつになります。
正規表現にしては可読性高いし、かなり緩い。ドメインのとこはドットなくても通すみたい。厳密にバリデートする必要がない場合はこれでいいかなっておもった〜

なお、たくさんの人々が使うようなパターンの正規表現は、まずライブラリ使う事を先に考えたほうがいい事を補足しておきます。