提取主机名顶级域的准确表示很复杂,因为每个顶级域名注册机构都可以自由制定有关域名发布方式和子域名定义的自己的政策。由于似乎没有任何标准机构协调这些或建立标准,这使得确定实际TLD有点复杂。
由于Web浏览器仅将cookie分配给已注册的域,并且出于安全原因必须警惕确保无法在更广泛的级别上分配cookie,因此这些浏览器通常包含某种形式的所有已知TLD的数据库。我发现Firefox有一个相当完整的数据库:
http://hg.mozilla.org/mozilla-central/raw-file/3f91606bd115/netwerk/dns/effective_tld_names.dat
我有两个具体问题:
虽然将此列表转换为正则表达式是相当简单的,但是有一个gem或引用regexp是一个比滚动自己更好的解决方案吗? tld gem仅提供根级域的国家级信息。
有没有比Firefox TLD列表更好的参考?本规范正确解析了所有local Google sites,但这不是一个详尽的测试。
如果没有任何东西,是否有人对进行此类操作的宝石感兴趣?这种事情应该存在于URI模块中,但显然是缺失的。
以下是我将这个文件转换为Ruby中可用的Regexp的看法:
TLD_SPEC = Regexp.new(
'[^\.]+\.(' + %q[
// ***** BEGIN LICENSE BLOCK *****
// ... (Rest of file)
].split(/\n/).collect do |line|
line.sub(%r[//.*], '').sub(/\s+$/, '')
end.reject(&:blank?).collect do |s|
Regexp.escape(s).sub(/^\\\*\\\./, '[^\.]+\.')
end.join('|') + ')$'
)
答案 0 :(得分:4)
您可能希望使用Addressable来查看是否符合您的要求。它比Ruby的默认URI库有更多的功能。特别是,它的模板功能可能会对您有所帮助。
来自文档:
Addressable是作为Ruby标准库一部分的URI实现的替代品。它更符合相关的RFC,并增加了对IRI和URI模板的支持。此外,它还为URI模板提供了广泛的支持。
随着最近新TLD的开放,它将成为一段时间的噩梦。查看右侧的相关列表,查看有多少人尝试找到解决方案。 Regex to match Domain.CCTLD建议使用一个函数将其分解为更小的步骤,这就是我要做的。尝试使用正则表达式假设您可以在一个表达式中完成所有操作,这开始闻起来像使用正则表达式来解析XML或HTML。对于单个模式,目标过于摇晃,或者至少对于单个可维护的模式。
该答案提到了公共TLD列表。使用那里的信息,您可以快速使用Ruby的Regexp.escape
和Regexp.union
方法来动态构建一个相当不错的正则表达式。如果我们可以使用Perl的Regexp :: Assemble模块,那会很好,但我们不会union
这样做。 (有关解决此问题的方法,请参阅“Is there an efficient way to perform hundreds of text substitutions in Ruby?”。)
答案 1 :(得分:1)
也许你可以将2合并,并将其上传到OData.org,github,sourceforge等地方。
答案 2 :(得分:0)
有一个名为public-suffix-list的宝石,可以访问更正式化的Mozilla列表。