我想要一个仅验证域名而不验证完整 URL 的解决方案,以下示例是我正在寻找的:
example.com -> true
example.net -> true
example.org -> true
example.biz -> true
example.co.uk -> true
sub.example.com -> true
example.com/folder -> false
exam*$ple.com -> false
接受的答案不完整/错误。
正则表达式模式;
-
不应该验证域,例如:
-example.com
, example--.com
, -example-.-.com
, example.000
, etc...
-
should验证域,例如:
schools.k12
, newTLD.clothing
, good.photography
, etc...
经过进一步的研究;下面是我能想到的最正确、跨语言和紧凑的模式:
^(?!\-)(?:(?:[a-zA-Z\d][a-zA-Z\d\-]{0,61})?[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$
此模式符合规范中定义的大多数*规则:
- 每个标签/级别(由点分隔)最多可以包含63 个字符.
- 完整域名最多可达127 级.
- 完整域名长度不能超过253 个字符在其文本表示中。
- 每个标签可以包含字母、数字和连字符.
- 标签不能start or end带连字符。
- 顶级域名(后缀)不能是全数字.
Note 1:正则表达式中不包含完整的域长度检查。它应该通过本机方法简单地检查,例如strlen(domain) <= 253
.
Note 2:此模式适用于大多数语言,包括 PHP、Javascript、Python 等...
See 演示在这里 https://regex101.com/r/IY4AVw/1(适用于 JS、PHP、Python)
更多信息:
-
上面的正则表达式不支持IDN http://en.wikipedia.org/wiki/Internationalized_domain_names.
-
没有规范规定扩展名 (TLD) 应介于 2 到 6 个字符之间。它实际上支持 63 个字符。查看当前TLD list here http://data.iana.org/TLD/tlds-alpha-by-domain.txt。此外,某些网络确实在内部使用自定义/伪 TLD。
-
登记机构可能会征收一些额外费用,具体规则 https://www.register.com/policy/domain-extension-rules.rcmx此正则表达式中未明确支持哪些内容。例如,.CO.UK
and .ORG.UK
必须至少包含 3 个字符,但少于 23 个字符(不包括扩展名)。此类规则是非标准的,可能会发生变化。如果无法维护,请不要实施它们。
-
正则表达式很棒,但并不是解决所有问题的最佳有效、高性能的解决方案。因此,只要有可能,就应该使用本机 URL 解析器。例如蟒蛇的urlparse() https://docs.python.org/2/library/urlparse.html方法或 PHP 的parse_url() http://php.net/manual/en/function.parse-url.php方法...
-
毕竟,这只是一个格式验证。正则表达式测试并不能确认域名实际上已配置/存在!您应该通过提出请求来测试是否存在。
规格和参考:
- IETF:RFC1035 https://www.rfc-editor.org/rfc/rfc1035
- IETF:RFC1123 https://www.rfc-editor.org/rfc/rfc1123#section-2.1
- IETF:RFC2181 https://www.rfc-editor.org/rfc/rfc2181#page-13
- IETF:RFC952 https://www.rfc-editor.org/rfc/rfc952
- 维基百科:域名系统 http://en.wikipedia.org/wiki/Domain_Name_System#cite_ref-rfc1034_1-2
UPDATE(2019-12-21):修复了子域的前导连字符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)