サイバーエリアリサーチ株式会社

5.2.3 ドメインのフォーマットチェック(正規表現)

ドメイン名のルール

ドメイン名には登録できる文字列についてのルールが定められており、これを活用して、フォームの誤入力などを見つけることができます。
「使えるのは半角英数とハイフンのみ」「ラベル(.(ドット)で区切られた文字列)の先頭と末尾にハイフンは使えない」「ラベル全体の長さは3文字以上63文字以下」等、ドメインには使える文字にルールがあります。また、現在ドメインは必ず2つ以上のラベルから成り立ちます。つまり、最低でも1つの「.」が入ることになります。
これらの特徴を利用して、明らかな誤入力・いたずら入力、フォームの脆弱性を付いた不正なアクセスを防ぐことができます。

ドメイン名のルール

上記の条件を正規表現で表してみましょう。

まず、先頭と末尾の文字は英数字のみなので

[A-Za-z0-9][A-Za-z0-9]

先頭・末尾を指定すると上記のようになります。

そして、先頭と末尾以外の文字は英数字に加えてハイフンも使えるため、

[A-Za-z0-9][A-Za-z0-9\-][A-Za-z0-9]

このように、ハイフンが加えられたものが入ります。

ラベル全体の長さは3文字以上63文字以下というルールがあるため、 先頭と末尾以外の文字に「1以上61以下」と言う長さのルールを加えます。

[A-Za-z0-9][A-Za-z0-9\-]{1,61}[A-Za-z0-9]

TLD以外のラベルには、末尾に.(ドット)がつくので

[A-Za-z0-9][A-Za-z0-9\-]{1,61}[A-Za-z0-9]\.

このようになります。

これが最低でも1つ、その後ろにTLDが続きます。現在TLDに使われている文字はアルファベットのみなので、数字やハイフンにはマッチしないようにします。

([A-Za-z0-9][A-Za-z0-9\-]{1,61}[A-Za-z0-9]\.)+[A-Za-z]+

ルールの変化にあわせる

ICANNは2012年に新しいgTLDを募集する取り組みを行い、新たなgTLDが追加されました。ここからも分かる通り、ドメイン名のルールは時と共にアップデートされたり、変更されたりする可能性がないとは言えません。
現在使われているTLDはどれも数字を含まないため上記のサンプルではTLDはアルファベットのみの文字列にマッチするようにしています。しかし、将来的に数字を含むTLDが現れた場合は、それに合わせて柔軟に対応していく必要があります。

上記で紹介した正規表現のパターンは、次のページで紹介されているものを参考にさせて頂きました。
・「かなり使えるPHPの正規表現まとめ」- IDEA*IDEA
http://www.ideaxidea.com/archives/2009/03/practical_php_regexs.html