问题 使用正则表达式从URL中提取顶级域和二级域


如何使用正则表达式从URL中仅提取顶级域名和二级域名?我想跳过所有较低级别的域名。有任何想法吗?


6233
2018-01-16 21:56


起源



答案:


这是我的想法,

使用。匹配从行尾开始的三次非点的任何内容 $ 锚。

字符串末尾的最后一个匹配应该是可选的 .com.au 要么 .co.nz 域名类型。

最后和最后一个匹配项只匹配2-3个字符,因此不会将它与二级域名混淆。


正则表达式:

[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$


示范:

Regex101示例


13
2018-01-16 22:41



谢谢,这很好用! - mel
那些顶级域名如“police.uk”或“parliament.uk”等等。更多关于.uk域名的信息: en.wikipedia.org/wiki/.uk - LukasMac


答案:


这是我的想法,

使用。匹配从行尾开始的三次非点的任何内容 $ 锚。

字符串末尾的最后一个匹配应该是可选的 .com.au 要么 .co.nz 域名类型。

最后和最后一个匹配项只匹配2-3个字符,因此不会将它与二级域名混淆。


正则表达式:

[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$


示范:

Regex101示例


13
2018-01-16 22:41



谢谢,这很好用! - mel
那些顶级域名如“police.uk”或“parliament.uk”等等。更多关于.uk域名的信息: en.wikipedia.org/wiki/.uk - LukasMac


你可以用这个:

(\w+\.\w+)$

如果没有更多细节(样本文件,您正在使用的语言),很难确切地知道这是否有效。

例: http://regex101.com/r/wD8eP2


5
2018-01-16 22:01



谢谢,这就是我需要的。 - mel


对于任何使用JavaScript并希望以简单的方式提取顶级和二级域名的人,我最终这样做:

'example.aus.com'.match(/\.\w{2,3}\b/g).join('')

这匹配任何一个句点后跟两个或三个字符然后a 字边界

这是一些示例输出:

'example.aus.com'       // .aus.com
'example.austin.com'    // .com
'example.aus.com/howdy' // .aus.com
'example.co.uk/howdy'   // .co.uk

有些人可能需要更聪明的东西,但这对我来说对我的特定数据集来说已经足够了。

编辑

我意识到实际上有相当多的二级域名超过3个字符(并允许)。所以,为简单起见,我只删除了我的正则表达式的字符计数元素:

'example.aus.com'.match(/\.\w*\b/g).join('')

0
2017-10-25 13:13



OP要求排除任何较低级域名,例如lowerlevel.domain.co.uk使用你的例子给'.domain.co.uk'。也不处理以http://或http://开头的URL - Davos


通过捕获组,您可以实现一些魔法。

例如,请考虑以下javascript:

let hostname = 'test.something.else.be';
let domain = hostname.replace(/^.+\.([^\.]+\.[^\.]+)$/, '$1');

document.write(domain);

这将导致包含的字符串 'else.com'。这是因为正则表达式本身将匹配完整的字符串,捕获组将映射到 $1。所以它取代了完整的字符串 'test.something.else.com' 同 '$1' 这实际上是 'else.com'

正则表达式并不漂亮,可以通过类似的东西变得更有活力 {3} 用于定义要查找子域的深度级别,但这只是一个例子。


0
2018-04-09 19:03





如果您想要所有特定的顶级域名,那么您可以编写如下的正则表达式:

[RegularExpression("^(https?:\\/\\/)?(([\\w]+)?\\.?(\\w+\\.((za|zappos|zara|zero|zip|zippo|zm|zone|zuerich|zw))))\\/?$", ErrorMessage = "Is not a valid fully-qualified URL.")]

您还可以从此链接中输入更多域名:

https://www.icann.org/resources/pages/tlds-2012-02-25-en


0
2017-07-30 11:03





由于TLD现在包含超过三个字符的内容,如.wang和.travel,这里有一个满足这些新TLD的正则表达式:

([^.\s]+\.[^.\s]+)$

策略:从字符串的末尾开始,查找一个或多个不是句点或空格的字符,后跟一个句点,后跟一个或多个不是句点或空格的字符。

http://regexr.com/3bmb3


-2
2017-08-29 21:40





如果你需要更具体:

/\.(?:nl|se|no|es|milru|fr|es|uk|ca|de|jp|au|us|ch|it|io|org|com|net|int|edu|mil|arpa)/

基于 http://www.seobythesea.com/2006/01/googles-most-popular-and-least-popular-top-level-domains/


-2
2018-03-16 04:35



参考了一篇非常古老的文章(撰写本文时为10岁)。现在还有数十个顶级域名。这可能误导读者认为这是一个完整的清单 - Digs
@Digs你是对的,我还在寻找TLD的完整列表 - Dorian
这是一项几乎不可能完成的任务,新的通用TLD一直在推出。 .christmas,.london,.bar,.bank?看到 newgtlds.icann.org/en/announcements-and-media/case-studies 可能最好使用其他答案中提到的正则表达式之一(例如: \.[a-z]{2,3}(\.[a-z]{2,3})?) - Digs