Регулярное выражение - извлечение субдомена и домена

Я пытаюсь сформировать регулярное выражение (javascript/ node.js), которое будет извлекать часть поддомена и домена из любого заданного URL-адреса. Это то, с чем я столкнулся:

[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)

Прямо сейчас, я просто рассматриваю http, https для протокола и исключаю "www". часть из участка субдомена + домена URL. Я проверил выражение, и оно почти работает. Но вот проблема:

Успех

'http://mplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

'http://lplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

Отказ

'http://play.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

'http://tplay.google.co.in/sadfask/asdkfals?dk=10'.match(/[^(?:http:\/\/|www\.|https:\/\/)]([^\/]+)/i)

Я просто использую первый элемент из массива результатов. Я не могу понять, почему "играть". и "tplay". не работает. Может ли кто-нибудь помочь мне в этом отношении?

Имеет ли значение "/p" и "/t" значение для оценщика регулярных выражений?

Есть ли другой способ извлечения поддомена и домена из любого заданного URL с использованием регулярного выражения?

Изменить -

Пример:

https://play.google.com/store/apps/details?id=com.skgames.trafficracer = > play.google.com

https://mail.google.com/mail/u/0/#inbox = > mail.google.com

Ответ 1

Ваше регулярное выражение не кажется правильным. Попробуйте это регулярное выражение:

/^(?:https?:\/\/)?(?:[^@\n][email protected])?(?:www\.)?([^:\/\n?]+)/img

RegEx Demo

Ответ 2

Вы примерно один миллионный человек, который пытается проанализировать URL-адреса в JavaScript. Я немного удивлен, что вы не видели ни одного из существующих вопросов о SO, датируемых годами. Последнее, что вы хотите сделать, это написать еще одно неправильное регулярное выражение со всем уважением к тем, кто дал ответы на ваш вопрос.

Есть много хорошо документированных библиотек и подходов к решению этой проблемы. Погугли это. Самый простой способ заключается в создании a элемент памяти, присвоить ему href, а затем получить доступ к его hostname и другие свойства. Смотрите http://tutorialzine.com/2013/07/quick-tip-parse-urls/. Если это не помогает вашей лодке, используйте библиотеку вроде uri.j s.

Если вы действительно не хотите использовать библиотеку и настаиваете на изобретении велосипеда, то, по крайней мере, сделайте что-то вроде следующего:

function get_domain_from_url(url) {
    var a = document.createElement('a').
    a.setAttribute('href', url);
    return a.hostname;
}

По сути, вы делегируете извлечение части URL домена/домена в логику разбора URL браузера, что НАМНОГО лучше, чем все, что вы когда-либо будете писать.

Также см. Разбор URL с помощью jquery/javascript? , Разбор URL с Javascript, Как мне разобрать URL в имя хоста и путь в JavaScript? или проанализируйте URL с помощью JavaScript или jQuery. Как ты скучал по этим? Извините, я должен проголосовать, чтобы закрыть это как дубликат.

Ответ 4

Здесь решение игнорирует все до ://

.*\://?([^\/]+)

Если вы хотите игнорировать www.

.*\://(?:www.)?([^\/]+)

Ответ 5

Ваше выражение регулярного выражения работает очень хорошо. Вам нужно только снять скобки. Окончательное выражение:

^(?:http:\/\/|www\.|https:\/\/)([^\/]+)

Надеюсь, это полезно!