正しいFQDNが入力されているかどうかを検証するための迅速で汚れた方法はありますか? DNSサーバーまたはインターネット接続がないため、regex/awk/sedを介して検証を行う必要があることに注意してください。
何か案は?
最近では、国際化されたドメイン名と数千(!)の新しいTLDがあり、より難しくなっています。
簡単な部分は、「。」でコンポーネントを分割できることです。
登録可能なTLDのリストが必要です。そのためのサイトがあります:
https://publicsuffix.org/list/effective_tld_names.dat
ICANNが認識したもののみをチェックする必要があります。登録可能なTLDには、「co.uk」などの複数のコンポーネントを含めることができます。
次に、IDNとpunycodeがあります。ドメインは現在Unicodeです。例えば、
「xn--nnx388a」は「臺灣」と同等です。両方とも、偶然にも有効なTLDです。
Punycode変換コードについては、「 http://golang.org/src/pkg/net/http/cookiejar/punycode.go "」を参照してください。
各ドメインコンポーネントの構文のチェックにも新しいルールがあります。 http://tools.ietf.org/html/rfc589 のRFC5890を参照してください
コンポーネントは、Aラベル(ASCIIのみ)またはUnicodeのいずれかです。 ASCIIラベルは、古い構文に従うか、「xn--」で始まります。この場合、Unicode文字列のpunycodeバージョンです。
Unicodeのルールは非常に複雑で、RFC5890で規定されています。ルールは、左から右へのセットと右から左へのセットの文字の混合などを防ぐように設計されています。
簡単な答えはありません。
(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)
正規表現は常にこのようなもののせいぜい近似であり、ルールは時間とともに変化します。上記の正規表現は以下を念頭に置いて書かれており、はホスト名に固有です-
ホスト名は、ドットで連結された一連のラベルで構成されます。各ラベルの長さは1〜63文字で、次のものを含めることができます。
さらに:
いくつかの仮定:
結果:有効/無効
編集:ジョン・リックスは、TLDの仕様をオプションにするために正規表現の代替ハックを提供しました:
(?=^.{1,253}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(?<!-))|((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63})$)
編集2:誰かがjsで動作するバージョンを求めました。 jsで機能しないのは、jsが正規表現の後ろをサポートしていないためです。具体的には、コード(?<!-)
-前の文字をハイフンにできないことを指定します。
とにかく、ここでは後読みなしで書き換えられます-少しいですが、それほどではありません
(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)
同様に、John Rixのバージョンで同様の置換を行うことができます。
編集3:末尾のドットを許可する場合-技術的に許可されています:
(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}\.?$)
@ChaimKutがそれらを指摘し、いくつかの研究を行うまで、私は後続のドット構文に精通していませんでした
ただし、末尾のドットを使用すると、さまざまなツールで予測できない結果が生じる可能性があるため、注意が必要です。
この正規表現はあなたが望むものです:
(?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$)
サンプルドメイン(groupa-zone1appserver.example.comまたはcod.euなど)と一致します。
私は説明しようとします:
(?=^.{1,254}$)
は、1〜254文字の長さのドメイン名(任意の文字で始まる)に一致します。co.ukが最小長であると想定した場合は、5,254にもなります。
(^
試合開始
(?:
一致するグループを定義する
(?!\d+\.)
ドメイン名は数字で構成しないでください。したがって、1a.ko.ukがはいの場合、1234.co.ukまたはabc.123.ukは受け入れられません。
[a-zA-Z0-9_\-]
ドメイン名は、a-zA-Z0-9_-のみの単語で構成する必要があります
{1,63}
ドメインレベルの長さは最大63文字です(2,63になる可能性があります)
+
および
(?:[a-zA-Z]{2,})$)
ドメイン名の最後の部分の後に他のWordを続けてはならず、2文字以上のWordで構成する必要がありますa-zA-Z
考慮事項1:
RFC-2181の要件が緩和されているため、DNSラベルはほぼすべての記号の組み合わせで構成できることに注意してください(ただし、長さの制限はまだあります)。
"任意のリソースレコードのラベルとして使用できるバイナリ文字列。DNSプロトコルの実装では、使用可能なラベルに制限を設定しないでください。特に、DNSサーバーは一部のDNSクライアントプログラムでは受け入れられないラベルが含まれているため、ゾーンの提供を拒否します。 "( https://tools.ietf.org/html/rfc2181#section -11 )
考慮事項#2:
「トップレベルドメイン名がすべて数字ではないことを本質的に要求する追加のルールがあります」( https:// tools。 ietf.org/html/rfc3696#section-2 )
これら2つの考慮事項を考慮すると、正しい正規表現は次のようになります。
/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i
デモを参照@ http://regexr.com/3g5j
使用する この正規表現は、野生で発生するドメインを検証します。それは私が知っているすべての実用的なユースケースをカバーしています。新しいものは大歓迎です。 当社のガイドライン によれば、非キャプチャグループと貪欲なマッチングを回避します。
^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$
証明と説明: https://regex101.com/r/FLA9Bv/9
ドメインを検証するときに選択する方法は2つあります。
書籍によるFQDNマッチング(理論上の定義、実際にはめったに見られない):
実用的/保守的なFQDNマッチング(実際の定義、実際に期待され、サポートされている):
[a-zA-Z0-9.-]
次の式
(^((?=^.{4,253}$)(((http){0,1}|(http){0,1}|(ftp){0,1}|(ws){0,1})(s{0,1}):\/\/){0,1})((((?!-)[\pL0-9\-]{1,63})(?<!-)(\.)){1,})(((?!-)[a-z0-9\-]{1,63})(?<!-)((\/{0,1}[\pL\pN?=\-]*)+){1})$)
一致します
https://www.tes1t.com/lets/to?878932572
https://www.test.co.uk/lets/to?878932572
http://www.test.com/lets/to?878932572
http://www.test.co.uk/lets/to?878932572
ftp://www.test.com/lets/to?878932572
subdomain.test.com/lets/to?878932572
subdomain.test.com/lets/to?878932572
subdomain.subdomain.test.net/lets/to?878932572
sub-domain.test.net/lets/to?878932572
sub-domain.test.net/lets-go/to?878932572
www.test.net/lets/to?878932572
www.test-test.com/
www.test-test.com
subdomain.subdomainsubdomainsuèdomainsubdomainsubdomainsubdomainsubdomain.net/let2s/to?=878932572
www.test-test.co.uk
http://www.test-test-.com/test
www.test-teèst.co.uk/lets
www.test-test.co.uk/lets/
www.test-test.co.uk/lets/to?
test-test.co.uk/lets/to?
test-test.co.uk/lets/
test-test.co.uk/lets
test-test.co.uk
http://test.com/lets/to?878932572
https://test.com/lets/to?878932572
ftp://test.com/lets/to?878932572
ftps://test.com/lets/to?878932572
ws://test.com/lets/to?878932572aa
wss://test.com/lets/to?=878932572bar
test.com
subdomain.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.khbdomainsubdomainsubdomain.test.net/lets/to?87893257
一致しません:
www.-test-fail-.com
www.-test-fail.com
-test-fail.com
test-fail-.com
subdomain.subdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainubdomainsubdomainsubdomain.test.net/lets/to?878932572
subdomain.subdomainsubdomainsubdcnvcnvcnofhfhghgfhvnhj-mainsubdomainsubdohhghghghfhgffgjh-gfhfdhfdghmainsubdocgvhngvnbnbmghghghaihgfjgfnfhfdghgsufghgghghhdfjgffsgfbdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomain.test.net/lets/to?878932572
subdomain.test.test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test.khbdomainsubdomainsubdomain.test.net/lets/to?87893257