0

提取主机名顶级域的准确表示是复杂的,因为每个顶级域注册机构都可以自由制定自己的关于如何发布域和定义哪些子域的策略。由于似乎没有任何标准机构协调这些或建立标准,这使得确定实际的 TLD 变得有些复杂。

由于 Web 浏览器仅将 cookie 分配给已注册的域,并且出于安全原因必须保持警惕,以确保无法在更广泛的层面上分配 cookie,因此这些浏览器通常以某种形式包含所有已知 TLD 的数据库。我发现 Firefox 有一个相当完整的数据库:

http://hg.mozilla.org/mozilla-central/raw-file/3f91606bd115/netwerk/dns/effective_tld_names.dat

我有两个具体问题:

  • 尽管将此列表转换为正则表达式相当简单,但是否有一个 gem 或参考正则表达式比滚动您自己的解决方案更好?tld gem 仅提供根级域的国家级信息。

  • 有比 Firefox TLD 列表更好的参考吗?该规范正确解析了所有本地 Google 站点,但这并不是一个详尽的测试。

如果那里什么都没有,是否有人对执行这种操作的 gem 感兴趣?这种东西应该存在于 URI 模块中,但显然是缺失的。

这是我在 Ruby 中将此文件转换为可用的正则表达式的看法:

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('|') + ')$'
)
4

3 回答 3

4

您可能想考虑使用Addressable来查看它是否满足您的需求。它比 Ruby 的默认 URI 库有更多的功能。特别是,它的模板功能可能会对您有所帮助。

从文档:

Addressable 是 URI 实现的替代品,它是 Ruby 标准库的一部分。它更符合相关的 RFC,并增加了对 IRI 和 URI 模板的支持。此外,它还提供对 URI 模板的广泛支持。

随着最近新 TLD 的开放,这将是一段时间的噩梦。查看右侧的相关列表,了解有多少人正在尝试寻找解决方案。匹配 Domain.CCTLD的正则表达式建议使用函数将其分解为更小的步骤,这就是我要做的。尝试使用正则表达式执行此操作假定您可以在一个表达式中完成所有操作,这开始闻起来像使用正则表达式解析 XML 或 HTML。对于单一模式,或者至少对于单一可维护模式来说,目标过于摇摆不定。

该答案提到了公共 TLD 列表。使用那里的信息,您可以快速使用 RubyRegexp.escapeRegexp.union方法来动态构建一个相当好的正则表达式。如果我们有 Perl 的 Regexp::Assemble 模块可供我们使用,那就太好了,但我们union必须这样做。(有关解决此问题的方法,请参阅“在 Ruby 中执行数百个文本替换的有效方法吗? ”。)

于 2011-07-12T19:47:30.090 回答
1

这里有另一个平面文件数据库http://guava-libraries.googlecode.com/svn-history/r42/trunk/src/com/google/common/net/TldPatterns.java

也许您可以将两者结合起来,然后将其上传到 OData.org、github、sourceforge 等地方。

于 2011-02-17T07:56:57.747 回答
0

有一个名为public-suffix-list的 gem ,它提供对 Mozilla 列表的更正式版本的访问。

于 2011-07-12T16:54:42.740 回答