有没有一种快速有效的方法来验证是否输入了正确的FQDN?请记住,没有DNS服务器或Internet连接,因此必须通过regex/awk/sed完成验证。
有什么想法吗?
发布于 2014-10-29 05:41:35
现在更难了,有了国际化的域名和数千(!)新的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"。
检查每个域组件的语法也有新的规则。请访问https://www.rfc-editor.org/rfc/rfc5890查看RFC5890
组件可以是A标签(仅限ASCII)或Unicode。ASCII标签要么遵循旧语法,要么以"xn--“开头,在这种情况下,它们是Unicode字符串的双码版本。
Unicode的规则非常复杂,并且在RFC5890中给出。这些规则旨在防止从左到右和从右到左集合中的字符混合等情况。
抱歉,没有简单的答案。
发布于 2013-11-26 06:34:58
(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)正则表达式充其量只能是这类事情的近似值,并且规则会随着时间的推移而变化。上面的正则表达式是根据以下内容编写的,而是特定于主机名的-
主机名由一系列用点连接的标签组成。每个标签的长度为1到63个字符,可以包含:
此外:
一些假设:
结果:有效/无效
invalid
<>F245>
编辑: 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不支持regex向后看。具体地说,代码(?<!-) -它指定前一个字符不能是连字符。
无论如何,在这里它被重写了,没有后视-有点难看,但不是很多。
(?=^.{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指出了它们,我做了一些研究
然而,在我使用的各种工具中,使用尾随的点似乎会导致一些不可预测的结果,因此我建议您一定要小心。
发布于 2012-08-05 04:30:20
这个正则表达式就是您想要的:
(?=^.{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,})$)域名的最后部分不得后跟任何其他单词,且必须由至少2个字符a-zA-Z组成
https://stackoverflow.com/questions/11809631
复制相似问题