我正在使用Python,并希望简单的API或REGEX检查域名的有效性。根据有效性,我是句法有效性,而不是域名是否真正存在于Internet上。

有帮助吗?

解决方案

任何域名都是(语法上)有效的,如果它是一个分隔的标识符列表,每个列表不超过63个字符,并且由字母,数字和破折号组成(没有下划线)。

所以:

r'[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*'

将是一个开始。当然,如今,可能允许一些非ASCII字符(最近的开发)会发生很大的改变 - 您需要处理吗?

其他提示

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)

请注意,虽然您可以做 某物 带有正则表达式 最可靠的 测试有效域名的方法是实际尝试解析名称(使用 插座):

from socket import getaddrinfo

result = getaddrinfo("www.google.com", None)
print result[0][4]

请注意,从技术上讲,这可能会让您对DOS开放(如果有人提交了数千个无效的域名,那么解决无效的名称可能需要一段时间),但是您可以简单地对尝试此尝试的人进行评分。

这样做的优点是,它将捕获“ hotmail.con”为无效(而不是“ hotmail.com”),而正格说“ hotmail.con”是有效的。

我一直在使用它:

(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之类的后缀。

此时,答案都已经过时了。我相信以下将正确匹配当前规格:

r'^(?=.{1,253}$)(?!.*\.\..*)(?!\..*)([a-zA-Z0-9-]{,63}\.){,127}[a-zA-Z0-9-]{1,63}$'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top