-6

starbucks.com、apple.com、microsoft.comなどの以下のドメインを検証する状況があります。指定された正規表現のほとんどが正しく機能していません。私の状況でのドメイン検証に最適な正規表現は何でしょうか?

よろしくお願いします!

4

2 に答える 2

11

免責事項:「有効なドメイン」を定義するルールは、移動するターゲットを構成することに注意してください。以下の回答は、「古い学校」のDNSルール(ASCII文字のみを使用)のみを扱い、国際ドメイン(RFC3490に規定されている)を処理しようとはしていません。また、すぐに多くの新しいトップレベルドメイン(TLD)がポップアップするため、以下のソリューションを定期的に更新する必要があることにも注意してください(有効なTLDの現在のリストについてはIANA.ORGを参照してください)。

DNS名前付きホストの検証

関連するインターネットの推奨事項(RFC3986セクション2.2RFC1034セクション3.5およびRFC1123セクション2.1を参照)によると、サブドメイン(DNSドメインホスト名の一部)は、いくつかの要件を満たす必要があります。

サブドメイン

  • 各サブドメイン部分の長さは63以下でなければなりません。
  • 各サブドメイン部分は、英数字(つまり、文字[A-Za-z]または数字[0-9])で開始および終了する必要があります。
  • 各サブドメイン部分にはハイフン(ダッシュ)を含めることができますが、ハイフンで開始または終了することはできません。

これらの要件を満たすサブドメイン部分の式フラグメントは次のとおりです。

(?:[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9]|[A-Za-z0-9])

この式では、1文字しかないサブドメインの特殊なケースを処理するために、2つの選択肢を持つグループが必要であることに注意してください。また、この式フラグメントは単独で使用しないでください。DNSホスト名の次の式に示すように、より大きなコンテキストで境界条件を組み込む必要があります。

DNSホスト名

名前付きホスト(IPアドレスではない)は、追加の要件を満たす必要があります。

  • ホスト名は、それぞれが1つのドットで区切られた複数のサブドメイン部分で構成されている場合があります。
  • ホスト名全体の長さは255文字を超えてはなりません。
  • トップレベルドメイン(DNSホスト名の右端)は、国際的に認められている値の1つである必要があります。有効なトップレベルドメインのリストは、IANA.ORGによって管理されています。(ここで必要最低限​​の現在のリストを参照してください:http://data.iana.org/TLD/tlds-alpha-by-domain.txt)。

これを念頭に置いて、ここでコメント化された正規表現(C#構文)は、DNSホスト名を疑似検証します:(これには、サブドメインの上記の式の変更バージョンが組み込まれ、これにもコメントが追加されることに注意してください)。

if (Regex.IsMatch(text, @" # Rev:2013-03-26
    # Match DNS host domain having one or more subdomains.
    # Top level domain subset taken from IANA.ORG. See:
    # http://data.iana.org/TLD/tlds-alpha-by-domain.txt
    ^                  # Anchor to start of string.
    (?!.{256})         # Whole domain must be 255 or less.
    (?:                # Group for one or more sub-domains.
      [a-z0-9]         # Either subdomain length from 2-63.
      [a-z0-9-]{0,61}  # Middle part may have dashes.
      [a-z0-9]         # Starts and ends with alphanum.
      \.               # Dot separates subdomains.
    | [a-z0-9]         # or subdomain length == 1 char.
      \.               # Dot separates subdomains.
    )+                 # One or more sub-domains.
    (?:                # Top level domain alternatives.
      [a-z]{2}         # Either any 2 char country code,
    | AERO|ARPA|ASIA|BIZ|CAT|COM|COOP|EDU|  # or TLD 
      GOV|INFO|INT|JOBS|MIL|MOBI|MUSEUM|    # from list.
      NAME|NET|ORG|POST|PRO|TEL|TRAVEL|XXX  # IANA.ORG
    )                  # End group of TLD alternatives.
    $                  # Anchor to end of string.",
    RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace))
{
    // Valid named DNS host (domain).
} else {
    // NOT a valid named DNS host.
} 

この表現は完全ではないことに注意してください。1つ以上のサブドメインが必要ですが、技術的には、ホストはサブドメインを持たないTLDで構成できます(ただし、これはまれです)。また、2文字の国別コードTLDを明示的に記述していません。これは、任意の2文字を許可するだけです。また、さまざまなTLDもリストされていませんXN--XXXXX。このソリューションでは、まだ完全に実装されておらず、普遍的に受け入れられる国際ドメイン名も考慮されていません。

他のURIコンポーネントの検証の詳細については、私がしばらく前に書いた記事「正規表現URI検証」を参照してください。RFC3986で定義されているさまざまなURIコンポーネントすべてに対して、さまざまな言語のコードスニペットを提供します。

よろしくお願いします!

于 2013-03-26T18:15:06.050 に答える
1
^(http|https):\/\/|[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix

これは受け入れます:

apple.com

http://apple.com

http://www.apple.com

等々...

于 2013-03-26T16:05:24.000 に答える