これは少し古い投稿ですが、ここでのすべての正規表現には1つの非常に重要なコンポーネント、IDNドメイン名のサポートがありません。
IDNドメイン名はxn--で始まります。ドメイン名で拡張UTF-8文字を有効にします。たとえば、「♡.com」が有効なドメイン名であることをご存知ですか?うん、「ラブハートドットコム」!ドメイン名を検証するには、http://xn--c6h.com/に検証を通過させる必要があります。
この正規表現を使用するには、ドメインを小文字に変換し、IDNライブラリを使用してドメイン名をACE(「ASCII互換エンコーディング」とも呼ばれる)にエンコードする必要があります。良いライブラリの1つはGNU-Libidnです。
idn(1)は、国際化ドメイン名ライブラリへのコマンドラインインターフェイスです。次の例では、UTF-8のホスト名をACEエンコーディングに変換します。結果のURL https://nic.xn--flw351e/は、ACEでエンコードされたhttps://nic.xの歌と同等のものとして使用できます。
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
この魔法の正規表現はほとんどのドメインをカバーするはずです(ただし、私が見逃した有効なエッジケースがたくさんあると確信しています)。
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$
ドメイン検証の正規表現を選択する場合、ドメインが以下と一致するかどうかを確認する必要があります。
- xn--stackoverflow.com
- stackoverflow.xn--com
- stackoverflow.co.uk
これら3つのドメインが通過しない場合、正規表現が正当なドメインを許可していない可能性があります。
OracleのInternational Language Environment GuideのInternationalized Domain Names Supportページを確認してくださいをご覧ください。
ここで正規表現を試してみてください:http : //www.regexr.com/3abjr
ICANNは、 IDNドメインのいくつかの例を確認するために使用できる委任されたTLDのリストを保持しています。
編集:
^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$
この正規表現は、ホスト名の末尾に「-」が有効であるとマークされているドメインを停止します。さらに、無制限のサブドメインを許可します。