我正在使用python并希望使用简单的api或regex来检查域名的有效性。根据有效性,我是语法有效性,而不是域名是否实际存在于互联网上。
答案 0 :(得分:14)
任何域名在语法上都是有效的,如果它是一个以点分隔的标识符列表,每个域名不超过63个字符,并由字母,数字和破折号(没有下划线)组成。
所以:
r'[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*'
将是一个开始。当然,这些天可能会允许一些非Ascii字符(一个非常新的开发),它会更改参数很多 - 你需要处理它吗?
答案 1 :(得分:6)
r'^(?=.{4,255}$)([a-zA-Z0-9][a-zA-Z0-9-]{,61}[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,5}$'
a.in
)和最多255个字符答案 2 :(得分:2)
请注意,虽然您可以使用正则表达式执行某些,但最可靠的方法来测试有效域名实际上是尝试解析名称(使用{{ 3}}):
from socket import getaddrinfo
result = getaddrinfo("www.google.com", None)
print result[0][4]
请注意,从技术上讲,这可以让您对DoS开放(如果有人提交了数千个无效域名,可能需要一段时间来解决无效名称),但您可以简单地限制尝试此操作的人。
这样做的好处是它会将“hotmail.con”视为无效(而不是“hotmail.com”),而正则表达式会说“hotmail.con”有效。
答案 3 :(得分:0)
我一直在用这个:
(r'(\.|\/)(([A-Za-z\d]+|[A-Za-z\d][-])+[A-Za-z\d]+){1,63}\.([A-Za-z]{2,3}\.[A-Za-z]{2}|[A-Za-z]{2,6})')
确保它跟在点(www。)或/(http://)之后,破折号只出现在名称内,并匹配后缀,如gov.uk。
答案 4 :(得分:0)
在这一点上,答案都已经过时了。我相信以下内容将正确匹配当前规范:
r'^(?=.{1,253}$)(?!.*\.\..*)(?!\..*)([a-zA-Z0-9-]{,63}\.){,127}[a-zA-Z0-9-]{1,63}$'