我很难让这个正则表达式在非简单域上工作。
((https?):\/\/)?(\w+\.)*(?P<domain>\w+)\.(?P<extension>\w+)(\.\w+)(\/.*)?它的作用是:
http://google.com
https://google.com
http://www.google.com
https://www.google.com因此,在上述示例中,它将域识别为google,将扩展识别为.com。
但是,如果它是一个双词扩展,它就会结束:
http://www.google.com.hk在上面的例子中,域被看作是.com,扩展被看作是.hk。
你知道我如何调整正则表达式来理解.com.hk风格扩展吗?
谢谢。
发布于 2016-10-06 11:55:30
允许一个可选的“点对点字”作为扩展名的一部分:
((https?):\/\/)?(\w+)\.(?P<domain>\w+)\.(?P<extension>\w+(\.\w+)?)(\/.*)?我还从url的第一部分捕获中删除了*量词。
发布于 2016-10-06 11:46:05
试试这个- .*\:\/\/(?:www\.)?([^\/ ]+)
它将与示例中的扩展匹配。它停在一个/或一个空间。
发布于 2016-10-06 19:30:17
没有与域名相关的扩展概念,只有FQDN (完全限定域名)、TLD (顶级域名)、标签和子域。
如果我以你的最后一个例子http://www.google.com.hk
www,google,com,hk是标签www.google.com.hk是一个域,而FQDNhk是一个域,因为它是最后一个域,所以它是com.hk是hk子域。google.com.hk是com.hk子域。www.google.com.hk是google.com.hk子域。重要的是,标签com在这里没有什么特别之处,而且可以是任何东西。它没有TLD的约束(TLD不能是任何东西,您可以找到一个列表https://www.icann.org/resources/pages/listing-2012-02-25-en)。
结论com.hk与google.hk、google.com、pizza.org、org.pizza (是存在TLD pizza )没有区别,它们都有两个由点分隔的标记: TLD及其子结构域。
注意:有时最后两个标签称为SLD (二级域)。
无论您使用哪种语言,regex都是不适合的,如果您想解析URL,主要原因有两个:
urllib.parse,PHP中的parse_url,C#中的URI类,Java中的java.net.URL,nodejs中的url模块)。使用这些工具,您可以轻松地从URL中提取主机名。
在您需要首先检查这个主机名是否不是IPv4之后,因为在这种情况下,点没有相同的含义(这里没有将一个FQDN拆分成标签,而是分隔这四个数字),或者一个IPv6。
然后,只需拆分主机名并获取最后一项即可获得TLD。您可以将剩下的项重新加入,以获得主机名的“子域部分”。
如果您的目标是分离位于TLDs列表中的所有标签,则必须以您希望的方式将此列表包括在代码中,并检查项目是否在其末尾。
但是再一次,域名中没有“扩展”,“双字扩展”更少了。
https://stackoverflow.com/questions/39894769
复制相似问题