我正在尝试查找域 - 除了子域之外的所有内容。
我现在有这个正则表达式:
(?:[-a-zA-Z0-9]+\.)*([-a-zA-Z0-9]+(?:\.[a-zA-Z]{2,3})){1,2}
这适用于以下情况:
domain.tld
subdomain.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)
有什么想法吗?
最佳答案
我不确定这个问题是否“可以合理解决”; 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
完全没问题您定义的“域”。)
因此,如果您准备使用所提供的列表,您可以编写一个快速的小型解析器,它知道如何应用一般规则和异常(exception)来确定给定输入字符串中您的“域”的位置,并且仅返回您感兴趣的部分。
我认为更简单的方法注定会失败:一些ccTLDs例如 .ca
不使用二级域名,有些如 .br
使用数十个,有些如 lib.or.us
距离“域”有几个级别,例如 multnomah.lib.or.us
。除非您使用哪些域是公共(public)后缀的精选列表,否则您注定会在某些重要的输入字符串集上出错。
关于regex - 正则表达式 - 解析域问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856806/