Python 是否在字符串中检查有效的域名?
我正在使用python,希望使用一个简单的api或正则表达式来检查域名的有效性。根据有效性,我是语法有效性,而不是域名是否实际存在于互联网上。如果域名是一个以点分隔的标识符列表,每个标识符不超过63个字符,并且由字母、数字和破折号(无下划线)组成,则任何域名(在语法上)都是有效的 因此: 这将是一个开始。当然,现在可能会允许使用一些非Ascii字符(这是最近的一项发展),这会使参数发生很大变化——您需要处理这个问题吗Python 是否在字符串中检查有效的域名?,python,regex,api,domain-name,Python,Regex,Api,Domain Name,我正在使用python,希望使用一个简单的api或正则表达式来检查域名的有效性。根据有效性,我是语法有效性,而不是域名是否实际存在于互联网上。如果域名是一个以点分隔的标识符列表,每个标识符不超过63个字符,并且由字母、数字和破折号(无下划线)组成,则任何域名(在语法上)都是有效的 因此: 这将是一个开始。当然,现在可能会允许使用一些非Ascii字符(这是最近的一项发展),这会使参数发生很大变化——您需要处理这个问题吗 r'^(?=.{4,255}$)([a-zA-Z0-9][a-zA-Z0-9-
r'^(?=.{4,255}$)([a-zA-Z0-9][a-zA-Z0-9-]{,61}[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,5}$'
- Lookahead确保它至少包含4个(
)字符,最多包含255个字符a.in
- 一个或多个标签(以句点分隔),长度在1到63之间,以字母数字字符开头和结尾,中间包含字母数字字符和连字符。李>
- 后跟顶级域名(博物馆的最大长度为5)
(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})')
确保它紧跟在dot(www.)或/(http://)之后,破折号仅出现在名称内部,并与后缀(如gov.uk)匹配 在这一点上,这些问题的答案都已经过时了。我相信以下内容将与当前规范正确匹配:
r'^(?=.{1,253}$)(?!.*\.\..*)(?!\..*)([a-zA-Z0-9-]{,63}\.){,127}[a-zA-Z0-9-]{1,63}$'
标识符能否以连字符开头/结尾?谢谢!不,我不需要我需要一些基本的健全性检查,以确保它不包含任何黑名单字符,如'!“等等@Amarghosh,根据RFC 1035,是的:但RFC还说,“当为一个对象分配域名时,谨慎的用户将选择一个比这个更谨慎的名称”(特别是每个标识符,它称为“标签”,以字母开头,整个域名限制在255字节以内)在生成的内容上要保守,在接受的内容上要自由“!-”,因为RE无疑与“接受”有关,所以最好是自由的。!不一定是“黑名单”。RFC2872表示,不用作主机名的标签(即不映射到IP的标签,例如在TXT或SRV记录中)可能包含任何可打印的ASCII字符,因此u,;:'“@英镑和朋友们都可以参加。这个文档很好:这个问题没有指定上下文,所以我认为包含它也不是不合理的-我经常使用非LDH名称来查找DKIM密钥,它使用的名称像
blah.\u domainkey.example.com
。这实际上是一个单独的问题,不是问题的好答案。考虑到DNS过去曾被用于漏洞攻击,在使用字符串之前检查字符串是否至少是无效的才是明智的,而且它比DNS查找快几个数量级。这类似于运行代码以查看其是否恶意!这不能用于验证即将创建的域名,只能用于验证已经存在的域名。@MichaelSmith如果你在将近一年后仍然感到疑惑,那是因为你不能在这样的URL上进行DNS查找-DNS只用于域名,所以它会被额外的协议gubbins弄糊涂。这无法存储punycode。最短的西里尔文字两个字母顶级域是punycode中的6个字母。museum是6个字符,而不是5个字符。硬编码预期的TLD长度是个坏主意,特别是现在IDN TLD已经编码出来,因此比5长得多。@Amarghosh检查6个字符还是5个字符,因为限制是6个LTDSeems,已经讨论过了。原因是什么?如果这是电子邮件,那么应该通过对MX记录执行DNS查询来检查真正的有效性,而不是通过regexp.Nope。查找已知的无效名称没有任何好处,这只是浪费时间和资源。此外,您不需要MX记录来发送电子邮件,A记录就足够了。spec
(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})')
r'^(?=.{1,253}$)(?!.*\.\..*)(?!\..*)([a-zA-Z0-9-]{,63}\.){,127}[a-zA-Z0-9-]{1,63}$'