首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全限定域名验证

问全限定域名验证
EN

Stack Overflow用户
提问于 2012-08-04 23:09:22
回答 6查看 95.9K关注 0票数 34

有没有一种快速有效的方法来验证是否输入了正确的FQDN?请记住,没有DNS服务器或Internet连接,因此必须通过regex/awk/sed完成验证。

有什么想法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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中给出。这些规则旨在防止从左到右和从右到左集合中的字符混合等情况。

抱歉,没有简单的答案。

票数 19
EN

Stack Overflow用户

发布于 2013-11-26 06:34:58

代码语言:javascript
复制
(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}$)

正则表达式充其量只能是这类事情的近似值,并且规则会随着时间的推移而变化。上面的正则表达式是根据以下内容编写的,而是特定于主机名的-

主机名由一系列用点连接的标签组成。每个标签的长度为1到63个字符,可以包含:

  • a-z (不区分大小写),
  • the digits 0-9,
  • 和连字符(‘-’)。

此外:

一些假设:

  • TLD至少为2个字符,并且只有a-z
  • 我们希望至少比TLD高1级

结果:有效/无效

invalid

  • a.com

  • 911.gov- invalid

  • 911- invalid (no TLD)

  • a-.com - invalid

  • -a.com -
  • a.66-code invalid code valid

<>F245>

编辑: John Rix提供了一种替代的正则表达式,使TLD的规范成为可选的:

代码语言:javascript
复制
(?=^.{1,253}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(?<!-))|((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63})$)

  • 911 - valid
  • 911.gov -有效的

编辑2:有人要求一个可以在js中工作的版本。它在js中不起作用的原因是js不支持regex向后看。具体地说,代码(?<!-) -它指定前一个字符不能是连字符。

无论如何,在这里它被重写了,没有后视-有点难看,但不是很多。

代码语言:javascript
复制
(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)

你也可以在John Rix的版本上做一个类似的替换。

编辑3:如果你想允许拖尾点--这在技术上是允许的:

代码语言:javascript
复制
(?=^.{4,253}\.?$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+[a-zA-Z]{2,63}\.?$)

我不熟悉尾随的点语法,直到@ChaimKut指出了它们,我做了一些研究

然而,在我使用的各种工具中,使用尾随的点似乎会导致一些不可预测的结果,因此我建议您一定要小心。

票数 58
EN

Stack Overflow用户

发布于 2012-08-05 04:30:20

这个正则表达式就是您想要的:

代码语言:javascript
复制
(?=^.{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组成

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11809631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档