9

有没有办法从 url 获取顶级域名

例如,“ https://images.google.com/blah ”=>“google”

我找到了这个:

var domain = new URL(pageUrl).hostname; 

但它给了我“images.google.com”而不仅仅是谷歌。

我的单元测试是:

https://images.google.com   => google
https://www.google.com/blah => google
https://www.google.co.uk/blah => google
https://www.images.google.com/blah => google
4

7 回答 7

6

你可以这样做:

location.hostname.split('.').pop()

编辑

看到对您的问题的更改,您需要一个所有 TLD 的列表来匹配并从主机名中删除,然后您可以使用split('.').pop()

// small example list
var re = new RegExp('\.+(co.uk|me|com|us)')
var secondLevelDomain = 'https://www.google.co.uk'.replace(re, '').split('.').pop()
于 2014-09-19T21:27:37.037 回答
4

这是除了维护黑白顶级域列表之外最简单的解决方案。

  1. 如果顶级域有两个或更多字符“xxxx.yyy”,则匹配顶级域

  2. 匹配顶级域和子域,如果两者都在两个字符 'xxxxx.yy.zz' 下

  3. 删除匹配。

  4. 返回最后一个句点和字符串结尾之间的所有内容。


我把它分成两个单独的 OR|regex 规则:

  1. (\.[^\.]*)(\.*$)- 如果顶级域 >= 3,则到字符串结尾的最后一个句点。
  2. (\.[^\.]{0,2})(\.[^\.]{0,2})(\.*$)- 顶级域和子域 <= 2。

var regex_var = new RegExp(/(\.[^\.]{0,2})(\.[^\.]{0,2})(\.*$)|(\.[^\.]*)(\.*$)/);
var unit_test = 'xxx.yy.zz.'.replace(regex_var, '').split('.').pop();
document.write("Returned user entered domain: " + unit_test + "\n");

var result = location.hostname.replace(regex_var, '').split('.').pop();
document.write("Current Domain: " + result);

于 2015-03-18T20:47:03.713 回答
3

这个怎么样?

location.hostname.split('.').reverse()[1]

于 2014-09-19T21:28:25.937 回答
1
function getDomainName( hostname ) {
    var TLDs = new RegExp(/\.(com|net|org|biz|ltd|plc|edu|mil|asn|adm|adv|arq|art|bio|cng|cnt|ecn|eng|esp|etc|eti|fot|fst|g12|ind|inf|jor|lel|med|nom|ntr|odo|ppg|pro|psc|psi|rec|slg|tmp|tur|vet|zlg|asso|presse|k12|gov|muni|ernet|res|store|firm|arts|info|mobi|maori|iwi|travel|asia|web|tel)(\.[a-z]{2,3})?$|(\.[^\.]{2,3})(\.[^\.]{2,3})$|(\.[^\.]{2})$/);
    return hostname.replace(TLDs, '').split('.').pop();
}

/*** TEST ***/

var domains = [
    'domain.com',
    'subdomain.domain.com',
    'www.subdomain.domain.com',
    'www.subdomain.domain.info',
    'www.subdomain.domain.info.xx',
    'mail.subdomain.domain.co.uk',
    'mail.subdomain.domain.xxx.yy',
    'mail.subdomain.domain.xx.yyy',
    'mail.subdomain.domain.xx',
    'domain.xx'
];

var result = [];
for (var i = 0; i < domains.length; i++) {
    result.push( getDomainName( domains[i] ) );
}

alert ( result.join(' | ') );

// result: domain | domain | domain | domain | domain | domain | domain | domain | domain | domain
于 2015-09-26T06:01:24.987 回答
1

这是我对解决问题的天真看法。

url.split('.').reverse()[1].split('//').reverse()[0]

支持子域,但不支持公共后缀 SLD。

于 2018-07-27T19:01:52.063 回答
0

您要从 URL 中提取的不是顶级域(TLD)。TLD 是最右边的部分,例如 .com。

话虽如此,我认为没有一种简单的方法可以做到这一点,因为 URL 有两个“常见”部分,如“.co.uk”,我想你不想在这些部分中提取“.co”案例。您可以使用现有的两部分“TLD”列表进行检查,以便您知道何时提取哪个部分。

于 2014-09-19T21:50:26.940 回答
0

我只是想添加一些东西,因为这个是在谷歌之上的,我正在寻找它。

您可以下载所有 url 的维基百科数据集(33Mb 下载)并将其用作您的测试用例的测试集。另一个测试来源是 Alexa 排名前 1.000.000 的网站和/或一些流行博客的下载并从中解析出 url。

首先,我将其范围限定为检索某个“对象”的唯一 URI。因为每个 html 页面原则上都可以有另一个 favicon 来指向通常代表对象。“那是所有者的域”。我还将其范围限定为 Alexa 前 10.000.000 个站点。然后您通过 Google Favicon 服务验证这与您自己的算法匹配的程度,以接收例如 favicon 并查看它们是否相同。

  • 首先,您需要了解顶级域名官员。这些在这里:https ://en.wikipedia.org/wiki/List_of_Internet_top-level_domains 。
  • 单击每个条目会给出官方子域/后缀(单击维基百科页面中的第一列)。这些也需要放入您的阵列中。由于“注册”域的所有内容都不是从中获取网站图标的域。那里有最奇怪的组合,并非所有组合都那么清楚,例如编号的组合是(例如https://en.wikipedia.org/wiki/.bg),但基于工作类型的官方组合......更模糊。所有这些都是数组中的键。因为首先你正在寻找这背后的第一个词。那是某人拥有的东西,需要一个网站图标来代表它。Mozilla 维护了一个列表,但您必须附加它。这个项目https://github.com/lupomontero/psl可能会有所帮助(基于https://publicsuffix.org/)但我在测试过程中注意到它并没有涵盖所有情况。
  • 然后是“非官方”域名注册,例如 facebook 游戏在 /facebook.com/xxs 下并有自己的图标。所以你需要把它也放在数组中,这样你就可以找到这些 uri 的唯一图标。在 Alexa 热门点击中,有相当多的条目不是主域,而是访问量最大的 /user/john(并且有另一个图标)。在 Alexa 中将范围限定为前 10.000.000 有助于将其范围限定为仅最流行的东西。
  • 一旦你有了这个数组并且你的测试集与你的匹配率达到了 80%,你就可以专注于上面没有涵盖的用例,例如各种重定向和更奇怪的东西,比如某些服务器奇怪的 http 状态和可能自定义的 nginx 服务器由某人修改等...
  • 如果您在全球化/本地化应用程序中使用它,要注意的另一件事是对语言和域具有相同的概念引用,例如 wikipedia.en 和 wikipedia.nl。在这种情况下,指向同一概念的“您单击的链接”必须考虑到较大门户中存在的这些属性。
  • 那么缺少的是例如 abcd.com 有 defgh.abcd.com 和 news.abcd.com ,而 defgh.abcd.com 是完全不同的东西,或者更糟糕的是重定向到一个完全不同的公司,你需要添加一些技巧,例如检查元数据或图标以确保这仍然是主域的一部分或完全不同的东西。

这是一项相当多的工作,并且要使其保持最新状态。我的建议是不要从简单的案例开始,例如https://en.wikipedia.org/wiki/.tj,而是先从困难的案例开始,例如https://en.wikipedia.org/wiki/.br。您需要将其设为字典/数组,因为“.uk”和“.gov.uk”是不同的键。

于 2020-07-01T20:03:13.320 回答