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

2024-03-29 08:07:55 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

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

所以:

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

会是个开始。当然,现在可能允许使用一些非Ascii字符(这是一个非常新的开发),这会极大地改变参数——您需要处理这个问题吗?

注意,虽然您可以使用正则表达式执行操作,但测试有效域名的最可靠的方法是实际尝试解析该名称(使用socket.getaddrinfo):

from socket import getaddrinfo

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

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

这样做的好处是,它会将“hotmail.con”捕获为无效(而不是“hotmail.com”,比方说),而正则表达式会将“hotmail.con”捕获为有效。

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)

相关问题 更多 >