检查字符串中的有效域名?

时间:2010-05-24 05:23:09

标签: python regex api domain-name

我正在使用python并希望使用简单的api或regex来检查域名的有效性。根据有效性,我是语法有效性,而不是域名是否实际存在于互联网上。

5 个答案:

答案 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}$'
  • Lookahead确保它至少有4个(a.in)和最多255个字符
  • 一个或多个标签(以句点分隔),长度介于1到63之间,以字母数字字符开头和结尾,中间包含字母数字字符和连字符。
  • 其次是顶级域名(博物馆的最大长度为5)

答案 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}$'