正则表达式 - 解析域问题

时间:2011-10-22 01:18:21

标签: regex

我正在尝试找到域名 - 除了子域名之外的所有内容。

我现在有这个正则表达式:

(?:[-a-zA-Z0-9]+\.)*([-a-zA-Z0-9]+(?:\.[a-zA-Z]{2,3})){1,2}

这适用于以下内容:

domain.tld
subdomain.tld

但它遇到麻烦,tld就像“.com.au”或“.co.uk”:

domain.co.uk (finds co.uk, should find domain.co.uk)
subdomain.domain.co.uk (finds co.uk, should find domain.co.uk)

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我不确定这个问题是否“可以合理解决”; Mozilla维护a list of 'public suffix' domains旨在帮助浏览器作者仅接受一个管理控制中的域的cookie(例如,阻止某人设置对*.co.uk.*.union.aero.有效的cookie)。它显然不完美(接近最后,您会找到一长串is-a-caterer.com - 样式的域名,因此foo.is-a-caterer.com无法设置bar.is-a-caterer.com将使用的Cookie ,但is-a-caterer.com完全是一个“领域”,因为你已经定义了它。)

因此,如果您准备使用提供的列表,您可以编写一个快速的小解析器,该解析器将知道如何应用一般规则和异常来确定给定输入字符串中“域”的位置,以及只返回你感兴趣的部分。

我认为更简单的方法注定要失败:某些ccTLDs(例如.ca)不使用二级域名,一些例如.br使用数十个,而一些例如{ {1}}距离“域”几个级别,例如lib.or.us。除非你使用哪些域是公共后缀的精选列表,否则你注定要对一些非平凡的输入字符串集合出错。