我知道这有点旧,但是这里的所有正则表达式都缺少一个非常重要的组成部分:对IDN域名的支持。
IDN域名以xn--开头。它们在域名中启用扩展的UTF-8字符。例如,您知道“♡.com”是有效域名吗?是的,“ love heart dot com”!要验证域名,您需要让http://xn--c6h.com/通过验证。
请注意,要使用此正则表达式,您需要将域转换为小写,并且还需要使用IDN库来确保将域名编码为ACE(也称为“ ASCII兼容编码”)。一个好的库是GNU-Libidn。
idn(1)是国际化域名库的命令行界面。下面的示例将UTF-8中的主机名转换为ACE编码。然后可以将生成的URL https://nic.xn--flw351e/用作与https:// nic。谷歌/相对应的ACE编码。
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
这个神奇的正则表达式应该涵盖大多数域(尽管我确信我错过了许多有效的边缘情况):
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$
选择域验证正则表达式时,应查看域是否符合以下条件:
- xn--stackoverflow.com
- stackoverflow.xn--com
- stackoverflow.co.uk
如果这三个域均未通过,则您的正则表达式可能不允许使用合法域!
请查阅Oracle国际语言环境指南中的“国际化域名支持”页面,以获取更多信息。
请随时在此处尝试正则表达式:http : //www.regexr.com/3abjr
ICANN保留了已委派的顶级域名清单,可用于查看IDN域的一些示例。
编辑:
^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$
此正则表达式将阻止在主机名末尾带有“-”的域被标记为有效域。此外,它允许无限的子域。