-6

我有一种情况需要验证以下域,例如 starbucks.com、apple.com、microsoft.com。大多数给定的正则表达式都无法正常工作。对于我的情况,什么是域验证的最佳正则表达式?

非常感谢您提前提供的帮助!

4

2 回答 2

11

免责声明:请注意,定义“有效域”的规则构成移动目标。下面的答案仅处理“老派”DNS 规则(仅使用 ASCII 字符),不尝试处理国际域(如RFC3490中所述)。另请注意,很快就会出现许多新的顶级域 (TLD),因此需要定期更新以下解决方案(请参阅:IANA.ORG以获取当前有效 TLD 的列表)。

DNS 命名主机验证

根据相关的 Internet 建议(RFC3986 第 2.2 节,依次指:RFC1034 第 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])

请注意,此表达式需要具有两个备选方案的组来处理只有一个字符的子域的特殊情况。此外,此表达式片段不应单独使用 - 它需要在更大的上下文中结合边界条件,如下面的 DNS 主机名表达式所示...

DNS 主机名

命名主机(不是 IP 地址)必须满足其他要求:

  • 主机名可能由多个子域部分组成,每个部分由一个点分隔。
  • 整个主机名的长度不应超过 255 个字符。
  • 顶级域(DNS 主机名的最右边部分)必须是国际公认的值之一。有效顶级域的列表由 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.
} 

请注意,此表达式并不完美。它需要一个或多个子域,但从技术上讲,主机可以由没有子域的 TLD 组成(但这很少见)。它也没有明确地拼出每两个字符的国家代码 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

这将接受:

苹果网

http://apple.com

http://www.apple.com

等等...

于 2013-03-26T16:05:24.000 回答