Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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
Regex 域和扩展的正则表达式可以';不能处理双字扩展名_Regex - Fatal编程技术网

Regex 域和扩展的正则表达式可以';不能处理双字扩展名

Regex 域和扩展的正则表达式可以';不能处理双字扩展名,regex,Regex,我正在努力使这个正则表达式在非简单域上工作 ((https?):\/\/)?(\w+\.)*(?P<domain>\w+)\.(?P<extension>\w+)(\.\w+)(\/.*)? 因此,在上面的示例中,它将域识别为google,将扩展名识别为.com 但如果它是一个双字扩展名,它将被忽略: http://www.google.com.hk 在上面的示例中,域被视为.com,扩展名被视为.hk 你知道我如何调整正则表达式来理解.com.hk样式扩展吗 谢谢。

我正在努力使这个正则表达式在非简单域上工作

((https?):\/\/)?(\w+\.)*(?P<domain>\w+)\.(?P<extension>\w+)(\.\w+)(\/.*)?
因此,在上面的示例中,它将域识别为
google
,将扩展名识别为
.com

但如果它是一个双字扩展名,它将被忽略:

http://www.google.com.hk
在上面的示例中,域被视为
.com
,扩展名被视为
.hk

你知道我如何调整正则表达式来理解
.com.hk
样式扩展吗

谢谢。

试试这个-
*\:\/\/(?:www\)([^\/]+)

这将匹配示例中的扩展。它在a/或空格处停止。

允许可选的“点然后字”作为扩展的一部分:

((https?):\/\/)?(\w+)\.(?P<domain>\w+)\.(?P<extension>\w+(\.\w+)?)(\/.*)?
((https?):\/\/)?(\w+)(\P\w+)。(\P\w+(\.\w+))(\/.*)?

我还从url第一部分的捕获中删除了
*
量词。

没有与域名相关的扩展概念,只有FQDN(完全限定域名)、TLD(顶级域)、标签和子域

如果我举你最后一个例子
http://www.google.com.hk

  • www
    google
    com
    hk
    都是标签
  • www.google.com.hk
    是一个域名,FQDN
  • hk
    是一个域,因为它是最后一个域,所以它是TLD
  • com.hk
    hk
    子域
  • google.com.hk
    是一个
    com.hk
    子域
  • www.google.com.hk
    是一个
    google.com.hk
    子域
重要的是标签
com
在这里没有什么特别的,可以是任何东西。它没有TLD的约束(TLD不能是任何东西,您可以找到一个列表)

结论
com.hk
google.hk
google.com
pizza.org
org.pizza
(是的,TLD
pizza
存在)没有什么不同,它们都有两个标签,由一个点分隔:TLD及其子域

注:有时最后两个标签称为SLD(二级域)


无论您使用何种语言,如果出于以下两个主要原因想要解析URL,regex都不是一个好办法:

  • URL语法比您想象的要复杂
  • 大多数语言都已经有了这样的工具(Python中的
    urllib.parse
    ,PHP中的
    parse\u url
    ,C中的
    URI
    类,java中的
    java.net.url
    ,nodejs中的url模块……)
使用这些工具,您可以轻松地从URL提取主机名


之后,您需要首先检查此主机名是否为IPv4,因为在这种情况下,dots的含义不相同(这里没有将FQDN拆分为标签,而是将四个数字分开),或者是IPv6

然后只需拆分主机名并获取最后一项即可获得TLD。您可以将其余的项连接回主机名,以获取主机名的“子域部分”

如果您的目标是分离TLD列表末尾的所有标签,则必须以您希望的方式在代码中包含此列表,并检查是否有来自末尾的项


但再一次,域名中没有“扩展名”,甚至更少有“双字扩展名”。

请参考此链接。希望它能起作用。不,那个链接不起作用。干杯。试试这个-
*\:\/\/(?:www\)([^\/]+)
来自@KarthickKumaramakrishnan的链接可以工作,我认为这是一个很好的解决方案@sideroxylon,谢谢。
((https?):\/\/)?(\w+)\.(?P<domain>\w+)\.(?P<extension>\w+(\.\w+)?)(\/.*)?