从URL获取二级域名

时间:2014-09-19 21:23:17

标签: javascript url subdomain url-parsing

有没有办法从网址

获取顶级域名

例如," https://images.google.com/blah" => "谷歌"

我发现了这个:

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

7 个答案:

答案 0 :(得分: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()

答案 1 :(得分:3)

除了保持白色和白色之外,这是最简单的解决方案。黑色顶级域名列表。

  1. 匹配顶级域名,如果它有两个或多个字符'xxxx.yyy'

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

  3. 删除匹配。

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


  5. 我把它分成两个独立的OR |正则表达式规则:

    1. (\.[^\.]*)(\.*$) - 如果顶级域名为> = 3,则为字符串结尾的上一个句点。
    2. (\.[^\.]{0,2})(\.[^\.]{0,2})(\.*$) - 顶级域和子域< = 2。
    3. 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);

答案 2 :(得分:1)

这个怎么样?

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

答案 3 :(得分:0)

您要从网址中提取的内容不是top-level domain(TLD)。 TLD是最右边的部分,例如.COM。

话虽如此,我并不认为有一种简单的方法可以做到这一点,因为那里的网址有两个"常见的"像" .co.uk"而且我想你不想要夸大" .co"在那些情况下。您可以使用现有的两部分" TLD列表"检查,以便你知道何时提取哪个部分。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

我只想添加一些东西,因为这是Google的顶部,并且我一直在搜索它。

您可以下载所有URL的Wikipedia数据集(下载量为33Mb),并将其用作测试用例的测试集。另一个测试来源是Alexa排名靠前的1.000.000网站和/或下载了一些populair博客,并从其中解析了网址。

首先,我对它进行范围界定以检索某个“对象”的唯一URI。由于每个html页面原则上都可以有另一个图标来指向通常表示该对象的图标。 “那所有者的域名是什么”。我还将范围仅限制在Alexa排名前10.000.000的网站上。然后,您可以使用Google Favicon服务验证它与您自己的算法相匹配的程度,以接收例如图标,看看它们是否相同。

  • 首先,您需要了解顶级域官员。这些在这里:https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
  • 单击每个条目将给出正式的子域/后缀(单击Wikipedia页面的第一列)。这些还需要 放在您的数组中。由于“注册”域的所有内容都是 而不是从中获取收藏夹图标的域。有最古怪的 那里的组合并不是很清楚,例如那些 被编号为(例如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%,您可以专注于上述示例未涵盖的用例。各种重定向和很多奇怪的东西,例如某些nginx服务器,这些服务器怪异的http状态,并可能由某人自定义等等。
  • 如果您在全球化/本地化的应用程序中使用它,则需要注意的另一件事是对语言和域使用相同的概念引用,例如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”是不同的键。