Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否在字符串中检查有效的域名?_Python_Regex_Api_Domain Name - Fatal编程技术网

Python 是否在字符串中检查有效的域名?

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-

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

如果域名是一个以点分隔的标识符列表,每个标识符不超过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)

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

请注意,从技术上讲,这可能会让您接受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})')

确保它紧跟在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}$'