在 C# 和 Javascript 中验证 FQDN 的正则表达式

Posted

技术标签:

【中文标题】在 C# 和 Javascript 中验证 FQDN 的正则表达式【英文标题】:Regular expression to validate FQDN in C# and Javascript 【发布时间】:2013-08-01 22:08:20 【问题描述】:

在 C# 和 javascript 中验证 FQDN 的正确正则表达式是什么? 我一直在四处寻找,我发现了不同的规格。哪个是正确的。

我发现的几个例子:

   1.(?=^.1,254$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]1,63(?<!-)\.?)+(?:[a-zA-Z]2,)$)

    2. (?=^.1,254$)(^(?:(?!\d|-)[a-zA-Z0-9\-]1,63(?<!-)\.?)+(?:[a-zA-Z]2,)$)

    3. \b((?=[a-z0-9-]1,63\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]2,63\b 

   (Regular Expression cook book)

请帮忙

【问题讨论】:

RFC 1035, blog.gnukai.com/2010/06/fqdn-regular-expression @Andreas:谢谢你。我见过这个。他说:“我对 RFC 规则的唯一偏差是额外的规则,即***域(最后一个 '.' 之后的部分)只能是字符,并且必须是 2 个或更多(.com, . net, .org, .eu, .uk, 等)。但我找不到记录在哪里。”不确定这是否正确。 来自RFC 920 - TLD 要求:ARPA、GOV、EDU、COM、MIL、ORG 或英文两字母国家代码。所以这似乎是一个有效的扩展/修改。 @Anders :我应该做些什么改变才能在 Javascript 中使用它。我尝试了以下 -> var fqdnRegEx = /(?=^.1,254$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]1,63 (? @Andreas 多年后回想起来,感觉已经很古老了 【参考方案1】:

一般来说,正则表达式食谱是一个很好的信息来源,由两位正则表达式专家编写,所以您应该从那里开始。那里概述的解决方案还不能完全适应您的需求(它不会验证整个字符串但会匹配子字符串,并且不会检查字符串的总长度),因此我们可以对其进行一些修改:

/^(?=.1,254$)((?=[a-z0-9-]1,63\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]2,63$/i

解释:

^                      # Start of string
(?=.1,254$)          # Assert length of string: 1-254 characters
(                      # Match the following group (domain name segment):
 (?=[a-z0-9-]1,63\.) # Assert length of group: 1-63 characters
 (xn--+)?              # Allow punycode notation (at least two dashes)
 [a-z0-9]+             # Match letters/digits
 (-[a-z0-9]+)*         # optionally followed by dash-separated letters/digits
 \.                    # followed by a dot.
)+                     # Repeat this as needed (at least one match is required)
[a-z]2,63            # Match the TLD (at least 2 characters)
$                      # End of string

【讨论】:

感谢您的回答。这行得通。请让我知道我可以参考哪些资源来查找 FQDN 上的规则,以便我可以进行更多测试? 上面的cmets中有一些RFC的链接;不过,这些文件相当复杂。也许en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names 有帮助? xn----dtbjjdcfhg5cckn1k9a.xn--p1ai 尝试...并获得“假”。 @tim 破折号应该允许在初始 xn-- 之后。如果 TLD 是 punycode,则 TLD 中可能允许使用数字。正如上面的用户所说,xn----dtbjjdcfhg5cckn1k9a.xn--p1ai 是一个真实的主机名。

以上是关于在 C# 和 Javascript 中验证 FQDN 的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

c# javascript mvc - 模型验证后出现 Javascript window.confirm 框集

javascript和c#中的正则表达式问题

如何通过 JavaScript 回调在 C# 中运行 QUnit 测试并返回测试结果?

JavaScript 正则表达式到 C#

在 C# 中解密和验证 PKCS7 消息

如何在 C# 中进行 SWIFT 代码和 IBAN 验证