由于每个顶级域注册表都可以免费构成有关如何发出域以及定义哪些子域的自由策略,因此提取主机名的顶级域的准确表示是复杂的。由于似乎没有任何标准机构协调这些或建立标准,因此确定实际的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列表更好的参考?全部 当地的Google网站 通过此规范正确解析,但这并不是一项详尽的测试。

如果没有什么都没有,是否有人对执行此类操作的宝石感兴趣?这种事情应该存在于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('|') + ')$'
)
有帮助吗?

解决方案

您可能想考虑使用 可寻址 看看是否有您需要的东西。它的功能比Ruby的默认URI库更多。特别是,其模板能力可能会帮助您。

从文档中:

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

随着新TLDS的最新开放,这将是一段噩梦。查看右侧的相关列表,以查看有多少人试图找到解决方案。 正则匹配域。 建议使用功能将其分解为较小的步骤,这就是我要做的。试图用正则表达式执行此操作,假设您可以用一个表达式完成所有操作,它开始闻起来像使用正则XML或HTML。目标对于单个模式或至少一个单个模式来说太摇摆了 可维护 图案。

该答案提到了公共TLD列表。使用那里的信息,您可以快速使用Ruby的 Regexp.escapeRegexp.union 即时建立相当好的正则态度的方法。如果我们拥有Perl的Regexp ::组装模块,那就太好了 union 将必须这样做。 (看 ”有没有有效的方法在Ruby中执行数百个文本替换?“为了解决这个问题。)

其他提示

这里还有另一个平坦的DB http://guava-libraries.googlecode.com/svn-history/r42/trunk/src/src/com/google/common/net/net/tldpaterns.java

也许您可以将2组结合在一起,然后将其上传到odata.org,github,sourceforge等。

有一个叫做的宝石 公共用餐列表 它可访问更正式的Mozilla列表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top