我需要一个正则表达式来捕获给定的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})$
幸运的是,这是两种相互排斥的模式。
答案 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