Получить доменное имя второго уровня из URL

Есть ли способ получить доменное имя верхнего уровня из URL-адреса

например, "https://images.google.com/blah" => "google"

Я нашел это:

var domain = new URL(pageUrl).hostname; 

но он дает мне «images.google.com» вместо просто google.

Модульные тесты, которые у меня есть:

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

person sublime    schedule 19.09.2014    source источник
comment
возможный дубликат Получить доменное имя поддомена Javascript   -  person Patrick Moore    schedule 20.09.2014
comment
Домен верхнего уровня на самом деле является частью .com, поэтому я думаю, что вы, возможно, ищете домен второго уровня. Но что вы ожидаете от чего-то вроде video.google.co.uk — co (домен второго уровня) или google или google.co?   -  person Bjorn Svensson    schedule 20.09.2014
comment
просто google я упомянул об этом в вопросе   -  person sublime    schedule 20.09.2014
comment
Я думал, что в вашем случае настоящий главный домен был com, а google был его субдоменом?   -  person Stranded Kid    schedule 07.01.2016


Ответы (7)


Вы можете сделать это:

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()
person Rob M.    schedule 19.09.2014
comment
Обратите внимание, что для этого ваше регулярное выражение будет состоять из страниц, просто проверьте страницы описания для каждой из них: en.wikipedia.org/wiki/List_of_Internet_domains_top-level_domains. Это также не распространяется на неофициальные регистраторы доменов, которые предлагают хостинг, например, wordpress.com и blogspot.com, где реальный сайт находится после /, но рассматривается владельцем как его домен. - person edelwater; 01.07.2020

Это самое простое решение, помимо поддержки белых и черных списков доменов верхнего уровня.

  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);

person Null    schedule 18.03.2015
comment
спасибо за решение второй проблемы! :) Вот букмарклет, который я сделал для копирования URL-адреса, отформатированного в Markdown, с доменным именем в конце: javascript:if(typeof%20WxXYnC60==typeof%20alert)WxXYnC60();window.prompt("Copy%20page%20title%20and%20URL","["+document.title+"]("+location.href+")%20("+location.hostname.replace(new%20RegExp(/(\.[^\.]{2})(\.[^\.]{2})(\.*$)|(\.[^\.]*)(\.*$)/),'').split('.').pop()+")");void(0); - person ultracrepidarian; 02.10.2015
comment
@Null Будет ли это регулярное выражение работать с интернационализированными нДВУ en.wikipedia.org/wiki/ - person Vipresh; 23.02.2016
comment
Хотя я не работал с международными кодированными доменами, пока существует одинаковая структура периодов для разделения доменов верхнего уровня, это будет работать. - person Null; 24.02.2016

Как насчет этого?

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

person kechol    schedule 19.09.2014

Вот мой наивный взгляд на решение проблемы.

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

Поддерживает поддомены, но не поддерживает SLD с публичным суффиксом.

person Etienne Martin    schedule 27.07.2018

То, что вы хотите извлечь из URL-адреса, не является доменом верхнего уровня (TLD). TLD — самая правая часть, например. .ком.

Сказав это, я не думаю, что есть простой способ сделать это, потому что есть URL-адреса, которые имеют две «общие» части, такие как «.co.uk», и я полагаю, что вы не хотите извлекать «.co» в этих случаи. Возможно, вы могли бы использовать список существующих «ДВУ», состоящих из двух частей, для проверки, чтобы знать, когда какую часть извлекать.

person Jonathan Steinbeck    schedule 19.09.2014

Я просто хотел кое-что добавить, так как этот находится на вершине Google, и я искал его.

Вы можете загрузить набор данных Википедии со всеми URL-адресами (33 МБ загрузки) и использовать его в качестве набора тестов для своих тестовых случаев. Другим тестовым источником является 1 000 000 лучших сайтов Alexa и / или загрузка некоторых популярных блогов и анализ их URL-адресов.

Прежде всего, я рассматриваю его для получения уникального URI для определенного объекта. Поскольку каждая html-страница в принципе может иметь другой значок, на который можно указать, в целом представляющий объект. то что является доменом для владельца. Я также рассматриваю его только для 10 000 000 лучших сайтов Alexa. И вы проверяете с помощью службы Google Favicon, насколько это соответствует вашему собственному алгоритму для получения, например. favicons и посмотрите, совпадают ли они.

  • Прежде всего, вам нужно знать официальный домен верхнего уровня. Они находятся здесь: 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 (и имеют другой значок). Выбор топ-10 000 000 в Alexa помогает охватить это только самыми популярными вещами.
  • Когда у вас есть этот массив, и вы на 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 — разные ключи.

person edelwater    schedule 01.07.2020

person    schedule
comment
Хороший ответ, ситуация всеобъемлющая. Полученные результаты в основном правильные. - person Lancer.Yan; 05.04.2020
comment
Это не работает с тщеславными доменами (например, заканчивающимися на .amsterdam). - person raarts; 06.06.2020