これは少し古い投稿であることは知っていますが、ここでの正規表現にはすべて、IDNドメイン名のサポートという非常に重要なコンポーネントが1つ欠けています。
IDNドメイン名はxn--で始まります。ドメイン名で拡張UTF-8文字を有効にします。たとえば、「♡.com」が有効なドメイン名であることをご存知ですか?ええ、「ラブハートドットコム」!ドメイン名を検証するには、http: //xn--c6h.com/に検証に合格させる必要があります。
この正規表現を使用するには、ドメインを小文字に変換する必要があります。また、IDNライブラリを使用して、ドメイン名をACEに確実にエンコードする必要があります(「ASCII互換エンコード」とも呼ばれます)。優れたライブラリの1つはGNU-Libidnです。
idn(1)は、国際化ドメイン名ライブラリへのコマンドラインインターフェイスです。次の例では、UTF-8のホスト名をACEエンコーディングに変換します。結果のURLhttps://nic.xn--flw351e/は、ACEでエンコードされたhttps://nic.谷歌/に相当するものとして使用できます。
$ 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's International Language Environment Guide』の「InternationalizedDomainNamesSupport」ページを参照してください。
ここで正規表現を試してみてください:http://www.regexr.com/3abjr
ICANNは、 IDNドメインのいくつかの例を表示するために使用できる、委任されたtldのリストを保持しています。
編集:
^(((?!\-))(xn\-\-)?[a-z0-9\-_]{0,61}[a-z0-9]{1,1}\.)*(xn\-\-)?([a-z0-9\-]{1,61}|[a-z0-9\-]{1,30})\.[a-z]{2,}$
この正規表現は、ホスト名の末尾に「-」が付いているドメインを、有効としてマークされているものとして停止します。さらに、無制限のサブドメインを許可します。