有什么想法吗?
(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)
正则表达式对于这种情况,最多只能是近似值,并且规则会随时间而改变。上面的正则表达式是针对以下情况编写的,特定于主机名-
主机名由一系列标签连接在一起组成。每个标签长度为1到63个字符,可以包含:
此外:
一些假设:
结果:有效/无效
编辑: John Rix提供了另一种正则表达式的技巧,使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}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(?<!-))|((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63})$)
- John Rix如今由于国际化域名和数千个新的顶级域名,这变得更加困难。
简单的部分是您仍然可以在“.”上拆分组件。
您需要一个可注册的顶级域名列表。有一个网站可以提供:
https://publicsuffix.org/list/effective_tld_names.dat
您只需要检查ICANN认可的那些。请注意,可注册的顶级域名可以有多个组件,例如“co.uk”。
然后是IDN和punycode。现在域名是Unicode编码的。例如,
“xn--nnx388a”相当于“臺灣”。顺便说一下,这两者都是有效的顶级域名。
有关punycode转换代码,请参见“http://golang.org/src/pkg/net/http/cookiejar/punycode.go”。。
每个域名组件语法的检查也有了新规则。请参见RFC5890: https://www.rfc-editor.org/rfc/rfc5890
组件可以是A-labels(仅ASCII)或Unicode。 ASCII标签要么遵循旧语法,要么以“xn--”开头,在这种情况下,它们是Unicode字符串的punycode版本。
Unicode的规则非常复杂,详见RFC5890。这些规则旨在防止从左到右和从右到左集合中混合字符等问题。
很抱歉没有简单的答案。
.company
内部TLD。 - Marcos Dione这个正则表达式就是您要找的:
(?=^.{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+\.)
域名不应由数字组成,因此不接受1234.co.uk或abc.123.uk,而接受1a.ko.uk。
[a-zA-Z0-9_\-]
域名应由只包含a-zA-Z0-9_-的单词组成
{1,63}
任何域级别的长度最多为63个字符(也可以是2,63)
+
和
(?:[a-zA-Z]{2,})$)
域名的最后一部分不应跟随任何其他单词,并且必须由至少两个a-zA-Z字符组成的单词组成。
ac.uk
做了什么?那不是一个有效的 FQDN;它是国家代码顶级域名下的中间级别域名。 - Jonathan Leffler?:(?!\d+\.)
这段代码不应该存在,因为只有数字的域名仍然是有效的,比如 911.com。 - Unixmonkey我们使用此正则表达式来验证在实际应用中出现的域名,它涵盖了我知道的所有实际情况,新的情况也欢迎添加。根据我们的准则,它避免了非捕获组和贪婪匹配。
^(?!.*?_.*?)(?!(?:[\w]+?\.)?\-[\w\.\-]*?)(?![\w]+?\-\.(?:[\w\.\-]+?))(?=[\w])(?=[\w\.\-]*?\.+[\w\.\-]*?)(?![\w\.\-]{254})(?!(?:\.?[\w\-\.]*?[\w\-]{64,}\.)+?)[\w\.\-]+?(?<![\w\-\.]*?\.[\d]+?)(?<=[\w\-]{2,})(?<![\w\-]{25})$
证明和解释:https://regex101.com/r/FLA9Bv/40
验证域名时有两种方法可供选择。
按照规范的FQDN匹配(理论定义,在实践中很少遇到):
实用/保守的FQDN匹配(实际定义,预期并且在实践中受到支持):
[a-zA-Z0-9.-]
上述正则表达式包含了符合规范和实用规则。
\w\d
或\d\w
都应该被替换为仅\w
,它是\d
的适当超集。 - AndrewF"; DROP *
或其他有趣的 DNS 标签或值。假设你只处理主机/域名,RFC1123 限制了允许的字符集。注意,这也意味着 _
不被允许。所以 this-is-a-host.example.com
是可以的,而 this_is_a_host.example.com
不行; -this-is-a-host-.example.com
也一样不行。 - Steven_ * ;
). 如前所述,它包含实际规则。我建议你尝试一下,如果你发现有什么应该或不应该被允许的,请让我们讨论一下。 - thisismydesign注意事项 #1:
请注意,由于 RFC-2181 中对 DNS 标签的要求放宽,标签可以包含几乎任何组合的符号(但长度限制仍然存在):
"任何二进制字符串都可以用作任何资源记录的标签。DNS 协议的实现不得对可以使用的标签施加任何限制。特别地,DNS 服务器不得拒绝服务区域,因为它包含一些可能不被某些 DNS 客户端程序接受的标签。" (https://www.rfc-editor.org/rfc/rfc2181#section-11)
注意事项 #2:
"还有一个额外的规则,基本上要求顶级域名不是全部由数字组成的" (https://www.rfc-editor.org/rfc/rfc3696#section-2)
考虑到这两个方面,正确的正则表达式如下:
/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i
请参见演示 @ http://regexr.com/3g5j0
(^((?=^.{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