我正在使用 python 并且想要一个简单的 api 或正则表达式来检查域名的有效性。通过有效性,我是句法有效性,而不是域名是否实际存在于互联网上。
问问题
19809 次
5 回答
16
任何域名都是(在语法上)有效的,如果它是一个点分隔的标识符列表,每个不超过 63 个字符,并且由字母、数字和破折号(没有下划线)组成。
所以:
r'[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*'
将是一个开始。当然,现在可能允许使用一些非 Ascii 字符(最近的发展),这会极大地改变参数——你需要处理吗?
于 2010-05-24T05:27:31.223 回答
6
r'^(?=.{4,255}$)([a-zA-Z0-9][a-zA-Z0-9-]{,61}[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,5}$'
- Lookahead 确保它有最少 4 个 (
a.in
) 和最多 255 个字符 - 一个或多个标签(以句点分隔),长度在 1 到 63 之间,以字母数字字符开头和结尾,中间包含字母数字字符和连字符。
- 后跟一个顶级域名(博物馆最大长度为5)
于 2010-05-24T05:31:44.803 回答
3
请注意,虽然您可以使用正则表达式做一些事情,但测试有效域名的最可靠方法是实际尝试解析名称(使用socket.getaddrinfo):
from socket import getaddrinfo
result = getaddrinfo("www.google.com", None)
print result[0][4]
请注意,从技术上讲,这可能会让您对 DoS 持开放态度(如果有人提交了数千个无效域名,解决无效域名可能需要一段时间),但您可以简单地限制尝试此操作的人的速率。
这样做的好处是它会将“hotmail.con”视为无效(而不是“hotmail.com”),而正则表达式会说“hotmail.con”是有效的。
于 2010-05-24T05:39:49.610 回答
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 等后缀。
于 2013-11-10T20:54:11.823 回答
0
在这一点上,规范的答案都已经过时了。我相信以下内容将正确匹配当前规范:
r'^(?=.{1,253}$)(?!.*\.\..*)(?!\..*)([a-zA-Z0-9-]{,63}\.){,127}[a-zA-Z0-9-]{1,63}$'
于 2017-12-12T17:18:26.190 回答