Я рекомендую использовать пакет npm psl (Public Suffix List) . «Общедоступный список суффиксов» - это список всех действительных суффиксов и правил домена, не только доменов верхнего уровня с кодом страны, но и символов Юникода, которые будут считаться корневым доменом (т. Е. Www. 食 狮. 公司 .cn, bckobe .jp и т. д.). Подробнее об этом читайте здесь .
Пытаться:
npm install --save psl
Затем с моей реализацией "extractHostname" запустите:
let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com
Я не могу использовать пакет npm, поэтому ниже тестирует только extractHostname.
function extractHostname(url) {
var hostname;
//find & remove protocol (http, ftp, etc.) and get hostname
if (url.indexOf("//") > -1) {
hostname = url.split('/')[2];
}
else {
hostname = url.split('/')[0];
}
//find & remove port number
hostname = hostname.split(':')[0];
//find & remove "?"
hostname = hostname.split('?')[0];
return hostname;
}
//test the code
console.log("== Testing extractHostname: ==");
console.log(extractHostname("http://www.blog.classroom.me.uk/index.php"));
console.log(extractHostname("http://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("https://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("ftps://ftp.websitename.com/dir/file.txt"));
console.log(extractHostname("websitename.com:1234/dir/file.txt"));
console.log(extractHostname("ftps://websitename.com:1234/dir/file.txt"));
console.log(extractHostname("example.com?param=value"));
console.log(extractHostname("https://facebook.github.io/jest/"));
console.log(extractHostname("//youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("http://localhost:4200/watch?v=ClkQA2Lb_iE"));
Независимо от наличия протокола или даже номера порта, вы можете извлечь домен. Это очень упрощенное решение без регулярных выражений, поэтому я думаю, что это подойдет.
* Спасибо @Timmerz, @renoirb, @rineez, @BigDong, @ ra00l, @ILikeBeansTacos, @CharlesRobertson за ваши предложения! @ ross-allen, спасибо за сообщение об ошибке!
url.split('/')[2]
Так независимо от того, мы пишемftp
,ftps
,https
, доменное имя будет ВСЕГДА быть указательным 2.return url.split('/')[2] || url.split('/')[0];
что соответствует, если нет протокола.if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
Трюк без использования регулярных выражений:
Оберните вышеупомянутое в функцию, такую как ниже, и у вас есть превосходный способ вырвать часть домена из URI.
источник
hostname
, а не должен, если вы хотите получить доступ как к, такhostname
и кport
(и получить его какdomain.sample:1234
простой доступa.host
)Нет необходимости анализировать строку, просто передайте ваш URL в качестве аргумента в
URL
конструктор :источник
Попробуй это:
Если вы хотите исключить порт из вашего результата, используйте это выражение:
Изменить: чтобы предотвратить сопоставление определенных доменов, используйте отрицательный взгляд.
(?!youtube.com)
источник
?' (query) or
символом # `(фрагмент). напримерhttp://example.com?var=val
илиhttp://example.com#fragment
. Таким образом, правильное регулярное выражение должно быть примерно таким:/^https?\:\/\/([^\/?#]+)/
. Кроме этого, вы получите мой +1 (это самое быстрое решение)(?:www\.)?
в отрицательный взгляд.(?:www\.)?
к регулярному выражению подобное:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
Парсинг URL может быть сложным, потому что вы можете иметь номера портов и специальные символы. Поэтому я рекомендую использовать что-то вроде parseUri, чтобы сделать это для вас. Я сомневаюсь, что производительность будет проблемой, если вы не анализируете сотни URL-адресов.
источник
URL()
еще не полностью поддерживается. Проверьте: caniuse.com/#feat=urlОтвет 2020
Вам не нужны никакие дополнительные зависимости для этого! В зависимости от того, нужно ли оптимизировать производительность или нет, есть два хороших решения:
использование
URL.hostname
для удобства чтенияВ эпоху Вавилона самым чистым и простым решением является использование
URL.hostname
.URL.hostname
является частью URL API , поддерживаемого всеми основными браузерами, кроме IE ( caniuse ). Используйте URL-заполнение если вам нужно поддерживать устаревшие браузеры.Использование этого решения также даст вам доступ к другим свойствам и методам URL . Это будет полезно, если вы также хотите извлечь, например, имя пути URL или параметры строки запроса .
Используйте RegEx для производительности
URL.hostname
быстрее, чем использование якорного решения или parseUri . Однако это все еще намного медленнее, чем регулярное выражение gilly3 :Попробуйте сами на этом jsPerf
Если вам нужно обработать очень большое количество URL-адресов (где производительность будет иметь значение), я рекомендую использовать это решение. В противном случае выберите
URL.hostname
удобочитаемость.источник
Я пытался использовать данные решения, Избранный был излишним для моей цели, и «Создание элемента» портит меня.
Он еще не готов для порта в URL. Я надеюсь, что кто-то найдет это полезным
Запуск этого:
Результат:
источник
Если вы попали на эту страницу и ищете лучший REGEX URL, попробуйте следующее:
https://regex101.com/r/pX5dL9/1
Он работает для URL без http: //, с http, с https, просто с // и не захватывает путь и путь запроса.
Удачи
источник
Все свойства URL, нет зависимостей, нет JQuery, легко понять
Это решение дает ваш ответ плюс дополнительные свойства. Не требуется JQuery или другие зависимости, вставьте и уходите.
использование
Вывод
Код
Код разработан так, чтобы его было легко понять, а не супер быстро. Его можно легко вызывать 100 раз в секунду, поэтому он отлично подходит для внешнего интерфейса или нескольких серверов, но не для высокой пропускной способности.
источник
getUrlParts('www.google.com')
в консоли на этой странице.var url="https://mail.gggg.google.cn/link/link/link";
domainroot
google.com
gggg.google.cn
gggg
Просто используйте конструктор URL () :
источник
Искал решение этой проблемы сегодня. Ни один из приведенных выше ответов, похоже, не удовлетворил. Я хотел решение, которое могло бы быть одним вкладышем, без условной логики и ничего, что нужно было бы обернуть в функцию.
Вот то, что я придумал, похоже, работает очень хорошо:
На первый взгляд может показаться сложным, но работает довольно просто; ключ использует 'slice (-n)' в нескольких местах, где хорошая часть должна быть извлечена из конца массива разделения (и [0], чтобы получить переднюю часть массива разделения).
Каждый из этих тестов возвращает "example.com":
источник
Вот одна строка jQuery:
источник
источник
Первоначальный кредит поступает по адресу : http://www.primaryobjects.com/CMS/Article145
источник
Хорошо, я знаю, что это старый вопрос, но я сделал супер-эффективный парсер URL, поэтому решил поделиться им.
Как видите, структура функции очень странная, но для эффективности. Функции прототипа не используются, строка не повторяется более одного раза, и ни один символ не обрабатывается более, чем необходимо.
источник
Это не полный ответ, но приведенный ниже код должен помочь вам:
Я хотел бы, чтобы кто-то создал код быстрее, чем мой. Это также помогает улучшить себя.
источник
онлайн с JQuery
источник
источник
Я лично много исследовал для этого решения, и лучшее, что я смог найти, это на самом деле из «проверки браузера» CloudFlare:
Я переписал переменные так, чтобы они были более «читаемыми» человеком, но это делает работу лучше, чем ожидалось.
источник
Что ж, использование регулярного выражения будет намного проще:
источник
это заботится как о протоколе.
источник
Короче говоря, вы можете сделать это
Используйте вышеуказанную функцию, чтобы получить доменное имя
источник
?
в строке вашего доменного имени и вместоreturn domain.split("/")[0];
этогоreturn domain.split("?")[0];
надеяться, что это сработаетParse-Urls - это библиотека JavaScript с самыми надежными шаблонами
Вот краткое изложение особенностей:
Глава 1. Нормализуйте или проанализируйте один URL
Глава 2. Извлечение всех URL
Глава 3. Извлечение URI с определенными именами
Глава 4. Извлечение всех нечетких URL
Глава 5. Выделите все URL в текстах
Глава 6. Извлечение всех URL в необработанном HTML или XML
источник
Код:
Результат:
источник
www.
хотя не все URL имеют этот компонент), но это, безусловно, ответ .parse-domain - очень солидная легковесная библиотека
npm install parse-domain
Пример 1
Пример 2
Зачем?
В зависимости от варианта использования и объема я настоятельно рекомендую не решать эту проблему самостоятельно с помощью регулярных выражений или других средств манипулирования строками. Суть этой проблемы заключается в том, что вам необходимо знать все суффиксы gtld и cctld для правильного разбора строк url на домен и поддомен, эти суффиксы регулярно обновляются. Это решаемая проблема, а не та, которую вы хотите решить самостоятельно (если вы не гуглите или что-то в этом роде). Если вам не нужно имя хоста или доменное имя в крайнем случае, не пытайтесь разобраться в этом.
источник
Мой код выглядит так. Регулярные выражения могут принимать разные формы, и вот мои тестовые примеры, которые я считаю более масштабируемыми.
источник
Попробуйте код ниже для точного доменного имени, используя регулярное выражение,
String line = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";
источник