【发布时间】:2014-08-14 10:39:42
【问题描述】:
有什么算法可以解决这个问题吗? 例如
twitter.com
zamg.ac.at
是顶级域 和
pic.twitter.com
是二级域名
【问题讨论】:
-
我猜你的意思不是像 DNS 中的 TLD。那么在您的情况下,算法将在
.上拆分并取第二个最右边的值? (我知道不是很复杂)
有什么算法可以解决这个问题吗? 例如
twitter.com
zamg.ac.at
是顶级域 和
pic.twitter.com
是二级域名
【问题讨论】:
. 上拆分并取第二个最右边的值? (我知道不是很复杂)
定义:
不,AFAIK 是这样的:
示例:pic.twitter.com
顶级域名:com
二级域名:twitter
子域:pic(以及pic 之前的所有其他潜在部分)
换句话说,架构是(subdomain.)*secondlevel.toplevel
因此:zamg.ac.at 不是顶级域,而是ac.at 的子域,顶级域为at。
算法:
您可以按点拆分并将最后一部分用作 tld,将倒数第二部分用作第二级,其余部分用作子域。
但是,如果您想在应用程序语义的上下文中将 zamg.ac.at 和 twitter.com 定义为顶级(不要将其与对顶级的一般理解混为一谈),那么您需要一些映射,因为没有明显的模式。
为什么需要映射:
以.co.uk 为例:目前有google.co.uk 在您的语义中是顶级的,但是AFAIK 现在也可以注册google.uk(我想说这只是一个问题完成此操作的时间),因此两个域将处于同一级别(至少据我了解您的问题),但具有不同数量的部分。
至于.uk,您不能使用模式[^\.]+(\.\w{2})?\.\w{2}$ 来查找域的“顶级”部分,因为可能有“顶级”域使用更长的实际二级部分,例如.ltd.uk 或 .police.uk。这仅适用于.uk tld,还有很多其他的。
【讨论】:
如上一个答案所述,您需要一个映射 - 最好的来源是 publicsuffix.org,它为此目的维护了一个详细规则列表。 许多编程语言中有一系列库(完整列表为 here),它们可以在给定 URL 的情况下确定 TLD(更准确地说:可注册域部分)。
以下是使用 [whois-server-list] https://github.com/whois-server-list/public-suffix-list 从主机获取可注册域的示例!图书馆。 host String 变量是有效 URL 的主机部分(例如 www.publicsuffix.org)。 PublicSuffixList 和 PublicSuffixListFactory 是 de.malkusch.whoisServerList.publicSuffixList 包的类。
PublicSuffixListFactory factory = new PublicSuffixListFactory();
PublicSuffixList suffixListResolver = factory.build();
String registrableDomain = suffixListResolver.getRegistrableDomain(host);
【讨论】: