需要正则表达式来捕获二级域(SLD)

时间:2010-12-15 17:23:41

标签: javascript regex

我需要一个正则表达式来捕获给定的URL SLD。

示例:

jack.bop.com -> bop
bop.com -> bop
bop.de -> bop
bop.co.uk -> bop
bop.com.br -> bop

所有的bops :)。因此,此正则表达式需要忽略ccTLD,gTLD ccSLD。后者是困难的部分,因为我想让正则表达式尽可能不复杂。

首要任务是删除ccTLD,然后删除gTLD,然后检查ccSLD并将其删除(如果存在)。

非常感谢任何帮助:)

-

如果有帮助,ccTLD可以匹配:

\.([a-z]{2})$

gTLD与之匹配:

\.([a-z]{3-6})$

幸运的是,这是两种相互排斥的模式。

1 个答案:

答案 0 :(得分:4)

从技术上讲,'。co.uk'是'bop.co.uk'中的二级域名。您似乎要求的是域名的最高级别部分,该部分对公开注册开放,并且您想要剥离注册商的域名。

RFC 6265 §5.3调用您不想要“后缀”的后缀:

  

“公共后缀”是由公共注册管理机构控制的域名,例如“com”,“co.uk”和“pvt.k12.wy.us”。

Mozilla维持list of all known public suffixes

要创建正则表达式,您必须枚举所有公共后缀。您应该对它们进行排序,以便稍后出现其他元素后缀的元素。一种简单的方法是按降序排序。看起来逆转Mozilla的列表也足够了。

之后,正则表达式非常简单:

(.+\.)?([^.]+)\.(?:<suffixes>)$

其中<suffixes>将是|分隔的后缀列表。它的一部分看起来像:

gov\.uk|ac\.uk|co\.uk|com|org|net|us|uk

通过折叠共同后缀,有一些方法可以缩短它,尽管这使得正则表达式(以及计算它的过程)变得更加复杂。例如:

(?:gov\.|ac\.|co\.|)uk|com|org|net|us