我正在尝试找到域名 - 除了子域名之外的所有内容。
我现在有这个正则表达式:
(?:[-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)
有什么想法吗?
答案 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
。除非你使用哪些域是公共后缀的精选列表,否则你注定要对一些非平凡的输入字符串集合出错。