我知道这是一篇有点旧的文章,但这里的所有正则表达式都缺少一个非常重要的组件:对 IDN 域名的支持。
国际化域名 (IDN) http://en.wikipedia.org/wiki/Internationalized_domain_name以 xn-- 开头。它们在域名中启用扩展 UTF-8 字符。例如,您知道“♡.com”是一个有效的域名吗?是的,“爱心网络”!要验证域名,您需要让http://xn--c6h.com/ http://xn--c6h.com/通过验证。
请注意,要使用此正则表达式,您需要将域名转换为小写,并使用 IDN 库来确保将域名编码为 ACE(也称为“ASCII 兼容编码”)。 GNU-Libidn 是一个很好的库。
idn(1) 是国际化域名库的命令行界面。以下示例将 UTF-8 格式的主机名转换为 ACE 编码。生成的网址https://nic.xn--flw351e/ https://nic.xn--flw351e/然后可以用作 ACE 编码的等价物https://nic.谷歌/ https://nic.xn--flw351e/.
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
这个神奇的正则表达式应该涵盖most域(尽管我确信我错过了许多有效的边缘情况):
^((?!-))(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 国际语言环境指南中的国际化域名支持页面 https://docs.oracle.com/cd/E23824_01/html/E26033/glmkx.html了解更多信息。
请随意尝试这里的正则表达式:http://www.regexr.com/3abjr http://www.regexr.com/3abjr
ICANN keeps 已授权的 TLD 列表 http://newgtlds.icann.org/en/program-status/delegated-strings可用于查看 IDN 域的一些示例。
Edit:
^(((?!-))(xn--|_)?[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,})$
此正则表达式将阻止主机名末尾带有“-”的域被标记为有效。此外,它允许无限的子域。