Извлечь имя хоста из строки

239

Я хотел бы сопоставить только корень URL, а не весь URL из текстовой строки. Дано:

http://www.youtube.com/watch?v=ClkQA2Lb_iE
http://youtu.be/ClkQA2Lb_iE
http://www.example.com/12xy45
http://example.com/random

Я хочу, чтобы 2 последних экземпляра разрешались в домене www.example.comили example.com.

Я слышал, что регулярное выражение медленное, и это будет моим вторым выражением регулярного выражения на странице, поэтому, если есть возможность сделать это без регулярного выражения, дайте мне знать.

Я ищу версию этого решения для JS / jQuery.

Chamilyan
источник

Ответы:

281

Я рекомендую использовать пакет 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, спасибо за сообщение об ошибке!

lewdev
источник
3
Возможно, было бы лучше также поддерживать любую длину нотации протокола. Улучшение может быть url.split('/')[2]Так независимо от того, мы пишем ftp, ftps, https, доменное имя будет ВСЕГДА быть указательным 2.
renoirb
1
в зависимости от вашего сценария вам может понадобиться использовать то, return url.split('/')[2] || url.split('/')[0];что соответствует, если нет протокола.
Тиммерц
1
Почему вы, ребята, игнорируете тот факт, что эта функция не сможет вернуть доменное имя для некоторого ввода, такого как "ftp.websitename.com/dir/file.txt"?
rineez
1
@renoirb Извините, как это следует за Утиной?
Rineez
6
Один из них: youtube.com/watch- > www.youtube.com - это поддомен www домена youtube.com. Чтобы убрать лишний www я добавил:if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
ra00l
306

Трюк без использования регулярных выражений:

var tmp        = document.createElement ('a');
;   tmp.href   = "http://www.example.com/12xy45";

// tmp.hostname will now contain 'www.example.com'
// tmp.host will now contain hostname and port 'www.example.com:80'

Оберните вышеупомянутое в функцию, такую ​​как ниже, и у вас есть превосходный способ вырвать часть домена из URI.

function url_domain(data) {
  var    a      = document.createElement('a');
         a.href = data;
  return a.hostname;
}
Филипп Розен - refp
источник
8
на самом деле я собираюсь попробовать решение parseUri, но +1 за креативность.
Чамильян
11
@Chamilyan Я думаю, что вы должны принять этот ответ .. он намного круче и работает безо всякого лишнего :)
Lipis
3
просто к сведению - это решение не обрабатывает номера портов
Kyle
1
@Kyle, безусловно, делает, если вы подразумеваете, что номер порта должен быть частью hostname, а не должен, если вы хотите получить доступ как к, так hostnameи к port(и получить его как domain.sample:1234простой доступ a.host)
Filip Roséen - refp
46
Не используйте это, если вам нужно сделать это быстро . Это примерно в 40-60 раз медленнее, чем метод gilly3. Протестировано в jsperf: jsperf.com/hostname-from-url .
cprcrack
138

Нет необходимости анализировать строку, просто передайте ваш URL в качестве аргумента в URLконструктор :

var url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
var hostname = (new URL(url)).hostname;

assert(hostname === 'www.youtube.com');
Павло
источник
6
так же, как ответ на @mc ниже. Также взгляните на комментарий "новый URL () не работает с IE (проверено IE11)".
Чамильян
2
хотя, возможно, проще всего работать с решением, поэтому +1
Чамильян,
1
Я использую это в расширении Chrome, так что пока не поддерживается IE.
боди
1
+1 Это должен быть принятый ответ. Он быстрый, надежный, работает во всех современных браузерах, не зависит от внешней библиотеки и прост для понимания (в отличие от решений регулярных выражений). Я также предположил бы, что это очень быстро, поскольку он лежит в основе того, что делает каждый браузер (хотя обычно это не имеет большого значения).
Johndodo
128

Попробуй это:

var matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
var domain = matches && matches[1];  // domain will be null if no match is found

Если вы хотите исключить порт из вашего результата, используйте это выражение:

/^https?\:\/\/([^\/:?#]+)(?:[\/:?#]|$)/i

Изменить: чтобы предотвратить сопоставление определенных доменов, используйте отрицательный взгляд.(?!youtube.com)

/^https?\:\/\/(?!(?:www\.)?(?:youtube\.com|youtu\.be))([^\/:?#]+)(?:[\/:?#]|$)/i
gilly3
источник
3
Не забывайте о таких форматах, как протокол: // имя пользователя: пароль @ хост: порт / путь / к / ресурсу ...
Эндрю Уайт
1
Закрыть, но URL может не иметь пути, и часть узла может заканчиваться ?' (query) or символом # `(фрагмент). например http://example.com?var=valилиhttp://example.com#fragment . Таким образом, правильное регулярное выражение должно быть примерно таким:/^https?\:\/\/([^\/?#]+)/ . Кроме этого, вы получите мой +1 (это самое быстрое решение)
ridgerunner
2
Вы можете добавить дополнительный (?:www\.)? в отрицательный взгляд.
Ridgerunner
3
+1, потому что это очень быстро, что является требованием в моем случае
cprcrack
8
@FellowStranger - Добавьте (?:www\.)?к регулярному выражению подобное:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
gilly3
36

Парсинг URL может быть сложным, потому что вы можете иметь номера портов и специальные символы. Поэтому я рекомендую использовать что-то вроде parseUri, чтобы сделать это для вас. Я сомневаюсь, что производительность будет проблемой, если вы не анализируете сотни URL-адресов.

Андрей Белый
источник
12
Не используйте это, если вам нужно сделать это быстро . Просто получить имя хоста, это примерно в 40-60 раз медленнее, чем метод gilly3. Протестировано в jsperf: jsperf.com/hostname-from-url .
cprcrack
Вот обновленный URL (другой возвращает 404 не найденных): javascriptoo.com/application/html/js/franzenzenhofer/parseUri/…
ub3rst4r
@ BigDong, может быть, вы можете легко потребовать lib? nodejs.org/api/…
mc.
2
К сожалению, URL не поддерживается в IE10.
Advncd
1
URL()еще не полностью поддерживается. Проверьте: caniuse.com/#feat=url
Kousha
34

Ответ 2020

Вам не нужны никакие дополнительные зависимости для этого! В зависимости от того, нужно ли оптимизировать производительность или нет, есть два хороших решения:

использование URL.hostname для удобства чтения

В эпоху Вавилона самым чистым и простым решением является использование URL.hostname.

const getHostname = (url) => {
  // use URL constructor and return hostname
  return new URL(url).hostname;
}

// tests
console.log(getHostname("/programming/8498592/extract-hostname-name-from-string/"));
console.log(getHostname("https://developer.mozilla.org/en-US/docs/Web/API/URL/hostname"));

URL.hostnameявляется частью URL API , поддерживаемого всеми основными браузерами, кроме IE ( caniuse ). Используйте URL-заполнение если вам нужно поддерживать устаревшие браузеры.

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


Используйте RegEx для производительности

URL.hostnameбыстрее, чем использование якорного решения или parseUri . Однако это все еще намного медленнее, чем регулярное выражение gilly3 :

const getHostnameFromRegex = (url) => {
  // run against regex
  const matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
  // extract hostname (will be null if no match is found)
  return matches && matches[1];
}

// tests
console.log(getHostnameFromRegex("/programming/8498592/extract-hostname-name-from-string/"));
console.log(getHostnameFromRegex("https://developer.mozilla.org/en-US/docs/Web/API/URL/hostname"));

Попробуйте сами на этом jsPerf

Если вам нужно обработать очень большое количество URL-адресов (где производительность будет иметь значение), я рекомендую использовать это решение. В противном случае выберите URL.hostnameудобочитаемость.

Робин Метрал
источник
15

Я пытался использовать данные решения, Избранный был излишним для моей цели, и «Создание элемента» портит меня.

Он еще не готов для порта в URL. Я надеюсь, что кто-то найдет это полезным

function parseURL(url){
    parsed_url = {}

    if ( url == null || url.length == 0 )
        return parsed_url;

    protocol_i = url.indexOf('://');
    parsed_url.protocol = url.substr(0,protocol_i);

    remaining_url = url.substr(protocol_i + 3, url.length);
    domain_i = remaining_url.indexOf('/');
    domain_i = domain_i == -1 ? remaining_url.length - 1 : domain_i;
    parsed_url.domain = remaining_url.substr(0, domain_i);
    parsed_url.path = domain_i == -1 || domain_i + 1 == remaining_url.length ? null : remaining_url.substr(domain_i + 1, remaining_url.length);

    domain_parts = parsed_url.domain.split('.');
    switch ( domain_parts.length ){
        case 2:
          parsed_url.subdomain = null;
          parsed_url.host = domain_parts[0];
          parsed_url.tld = domain_parts[1];
          break;
        case 3:
          parsed_url.subdomain = domain_parts[0];
          parsed_url.host = domain_parts[1];
          parsed_url.tld = domain_parts[2];
          break;
        case 4:
          parsed_url.subdomain = domain_parts[0];
          parsed_url.host = domain_parts[1];
          parsed_url.tld = domain_parts[2] + '.' + domain_parts[3];
          break;
    }

    parsed_url.parent_domain = parsed_url.host + '.' + parsed_url.tld;

    return parsed_url;
}

Запуск этого:

parseURL('https://www.facebook.com/100003379429021_356001651189146');

Результат:

Object {
    domain : "www.facebook.com",
    host : "facebook",
    path : "100003379429021_356001651189146",
    protocol : "https",
    subdomain : "www",
    tld : "com"
}
BlackDivine
источник
1
Я обычно пропускаю ответы с низким голосом, но этот ответ заставил меня быть осторожным. Прекрасно работает! Спасибо @BlackDivine
Devaroop
Спасибо, что нашли время, чтобы оценить мои усилия @Devaroop
BlackDivine
15

Если вы попали на эту страницу и ищете лучший REGEX URL, попробуйте следующее:

^(?:https?:)?(?:\/\/)?([^\/\?]+)

https://regex101.com/r/pX5dL9/1

Он работает для URL без http: //, с http, с https, просто с // и не захватывает путь и путь запроса.

Удачи

Луис Лопес
источник
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - Из обзора
Лоуренс Айелло
1
Отредактировал и отправил регулярное выражение :)
Луис Лопес
6

Все свойства URL, нет зависимостей, нет JQuery, легко понять

Это решение дает ваш ответ плюс дополнительные свойства. Не требуется JQuery или другие зависимости, вставьте и уходите.

использование

getUrlParts("https://news.google.com/news/headlines/technology.html?ned=us&hl=en")

Вывод

{
  "origin": "https://news.google.com",
  "domain": "news.google.com",
  "subdomain": "news",
  "domainroot": "google.com",
  "domainpath": "news.google.com/news/headlines",
  "tld": ".com",
  "path": "news/headlines/technology.html",
  "query": "ned=us&hl=en",
  "protocol": "https",
  "port": 443,
  "parts": [
    "news",
    "google",
    "com"
  ],
  "segments": [
    "news",
    "headlines",
    "technology.html"
  ],
  "params": [
    {
      "key": "ned",
      "val": "us"
    },
    {
      "key": "hl",
      "val": "en"
    }
  ]
}

Код
Код разработан так, чтобы его было легко понять, а не супер быстро. Его можно легко вызывать 100 раз в секунду, поэтому он отлично подходит для внешнего интерфейса или нескольких серверов, но не для высокой пропускной способности.

function getUrlParts(fullyQualifiedUrl) {
    var url = {},
        tempProtocol
    var a = document.createElement('a')
    // if doesn't start with something like https:// it's not a url, but try to work around that
    if (fullyQualifiedUrl.indexOf('://') == -1) {
        tempProtocol = 'https://'
        a.href = tempProtocol + fullyQualifiedUrl
    } else
        a.href = fullyQualifiedUrl
    var parts = a.hostname.split('.')
    url.origin = tempProtocol ? "" : a.origin
    url.domain = a.hostname
    url.subdomain = parts[0]
    url.domainroot = ''
    url.domainpath = ''
    url.tld = '.' + parts[parts.length - 1]
    url.path = a.pathname.substring(1)
    url.query = a.search.substr(1)
    url.protocol = tempProtocol ? "" : a.protocol.substr(0, a.protocol.length - 1)
    url.port = tempProtocol ? "" : a.port ? a.port : a.protocol === 'http:' ? 80 : a.protocol === 'https:' ? 443 : a.port
    url.parts = parts
    url.segments = a.pathname === '/' ? [] : a.pathname.split('/').slice(1)
    url.params = url.query === '' ? [] : url.query.split('&')
    for (var j = 0; j < url.params.length; j++) {
        var param = url.params[j];
        var keyval = param.split('=')
        url.params[j] = {
            'key': keyval[0],
            'val': keyval[1]
        }
    }
    // domainroot
    if (parts.length > 2) {
        url.domainroot = parts[parts.length - 2] + '.' + parts[parts.length - 1];
        // check for country code top level domain
        if (parts[parts.length - 1].length == 2 && parts[parts.length - 1].length == 2)
            url.domainroot = parts[parts.length - 3] + '.' + url.domainroot;
    }
    // domainpath (domain+path without filenames) 
    if (url.segments.length > 0) {
        var lastSegment = url.segments[url.segments.length - 1]
        var endsWithFile = lastSegment.indexOf('.') != -1
        if (endsWithFile) {
            var fileSegment = url.path.indexOf(lastSegment)
            var pathNoFile = url.path.substr(0, fileSegment - 1)
            url.domainpath = url.domain
            if (pathNoFile)
                url.domainpath = url.domainpath + '/' + pathNoFile
        } else
            url.domainpath = url.domain + '/' + url.path
    } else
        url.domainpath = url.domain
    return url
}
whitneyland
источник
не удается при довольно простом разборе. Попробуйте getUrlParts('www.google.com')в консоли на этой странице.
Чамильян
@Chamilyan Это не URL, у URL есть протокол. Тем не менее, я обновил код для обработки более общего случая, поэтому, пожалуйста, верните свое отрицательное мнение.
Whitneyland
Я не голосовал против тебя. Но я бы сделал, если бы не спрашивал http: // в своем первоначальном вопросе.
Чамильян
2
@Lee терпит неудачу на этом входе: должно быть , но он выводит: в то время как это суб-домен (домены могут иметь несколько суб-домены). var url="https://mail.gggg.google.cn/link/link/link";domainrootgoogle.comgggg.google.cngggg
Нет
4

Искал решение этой проблемы сегодня. Ни один из приведенных выше ответов, похоже, не удовлетворил. Я хотел решение, которое могло бы быть одним вкладышем, без условной логики и ничего, что нужно было бы обернуть в функцию.

Вот то, что я придумал, похоже, работает очень хорошо:

имя хоста = "http://www.example.com:1234"
hostname.split ("//"). slice (-1) [0] .split (":") [0] .split ('.'). slice (-2) .join ('.') // дает "example.com"

На первый взгляд может показаться сложным, но работает довольно просто; ключ использует 'slice (-n)' в нескольких местах, где хорошая часть должна быть извлечена из конца массива разделения (и [0], чтобы получить переднюю часть массива разделения).

Каждый из этих тестов возвращает "example.com":

"Http://example.com" .split ( "//") .slice (-1) [0] .split ( ":"). [0] .split ( '') срез (-2). присоединиться('.')
«http://example.com:1234".split("//").slice(-1)[0].split(":")[0].split('.').slice(-2 ).присоединиться('.')
"Http://www.example.com:1234" .split ( "//") .slice (-1) [0] .split ( ":") [0] .split ( '') срез (. -2) .join ( '')
"Http://foo.www.example.com:1234" .split ( "//") .slice (-1) [0] .split ( ":") [0] .split ( ''). срез (-2) .join ( '')
zaphodb
источник
приятно, потому что он обрабатывает случай, когда www не имеет значения
Чамильян
4

Вот одна строка jQuery:

$('<a>').attr('href', url).prop('hostname');
gradosevic
источник
3
String.prototype.trim = function(){return his.replace(/^\s+|\s+$/g,"");}
function getHost(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    var _host,_arr;
    if(-1<url.indexOf("://")){
        _arr = url.split('://');
        if(-1<_arr[0].indexOf("/")||-1<_arr[0].indexOf(".")||-1<_arr[0].indexOf("\?")||-1<_arr[0].indexOf("\&")){
            _arr[0] = _arr[0].trim();
            if(0==_arr[0].indexOf("//")) _host = _arr[0].split("//")[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
            else return "";
        }
        else{
            _arr[1] = _arr[1].trim();
            _host = _arr[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
        }
    }
    else{
        if(0==url.indexOf("//")) _host = url.split("//")[1].split("/")[0].trim().split("\?")[0].split("\&")[0];
        else return "";
    }
    return _host;
}
function getHostname(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    return getHost(url).split(':')[0];
}
function getDomain(url){
    if("undefined"==typeof(url)||null==url) return "";
    url = url.trim(); if(""==url) return "";
    return getHostname(url).replace(/([a-zA-Z0-9]+.)/,"");
}
QazyCat
источник
поэтому я добавляю здесь комментарии: этот код работает даже с URL, который начинается с // или имеет синтаксические ошибки, такие как qqq.qqq.qqq & test = 2, или имеет параметр запроса с URL-адресом, как? param = www.www
QazyCat
3
function hostname(url) {
    var match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i);
    if ( match != null && match.length > 2 && typeof match[2] === 'string' && match[2].length > 0 ) return match[2];
}

Приведенный выше код успешно проанализирует имена хостов для следующих примеров URL:

http://WWW.first.com/folder/page.html first.com

http://mail.google.com/folder/page.html mail.google.com

https://mail.google.com/folder/page.html mail.google.com

http://www2.somewhere.com/folder/page.html?q=1 somewhere.com

https://www.another.eu/folder/page.html?q=1 another.eu

Первоначальный кредит поступает по адресу : http://www.primaryobjects.com/CMS/Article145

jaggedsoft
источник
3

Хорошо, я знаю, что это старый вопрос, но я сделал супер-эффективный парсер URL, поэтому решил поделиться им.

Как видите, структура функции очень странная, но для эффективности. Функции прототипа не используются, строка не повторяется более одного раза, и ни один символ не обрабатывается более, чем необходимо.

function getDomain(url) {
    var dom = "", v, step = 0;
    for(var i=0,l=url.length; i<l; i++) {
        v = url[i]; if(step == 0) {
            //First, skip 0 to 5 characters ending in ':' (ex: 'https://')
            if(i > 5) { i=-1; step=1; } else if(v == ':') { i+=2; step=1; }
        } else if(step == 1) {
            //Skip 0 or 4 characters 'www.'
            //(Note: Doesn't work with www.com, but that domain isn't claimed anyway.)
            if(v == 'w' && url[i+1] == 'w' && url[i+2] == 'w' && url[i+3] == '.') i+=4;
            dom+=url[i]; step=2;
        } else if(step == 2) {
            //Stop at subpages, queries, and hashes.
            if(v == '/' || v == '?' || v == '#') break; dom += v;
        }
    }
    return dom;
}
Pecacheu
источник
3

Это не полный ответ, но приведенный ниже код должен помочь вам:

function myFunction() {
    var str = "https://www.123rf.com/photo_10965738_lots-oop.html";
    matches = str.split('/');
    return matches[2];
}

Я хотел бы, чтобы кто-то создал код быстрее, чем мой. Это также помогает улучшить себя.

solokiran
источник
3

онлайн с JQuery

$('<a>').attr('href', document.location.href).prop('hostname');
VnDevil
источник
2
// use this if you know you have a subdomain
// www.domain.com -> domain.com
function getDomain() {
  return window.location.hostname.replace(/([a-zA-Z0-9]+.)/,"");
}
Gubatron
источник
2

Я лично много исследовал для этого решения, и лучшее, что я смог найти, это на самом деле из «проверки браузера» CloudFlare:

function getHostname(){  
            secretDiv = document.createElement('div');
            secretDiv.innerHTML = "<a href='/'>x</a>";
            secretDiv = secretDiv.firstChild.href;
            var HasHTTPS = secretDiv.match(/https?:\/\//)[0];
            secretDiv = secretDiv.substr(HasHTTPS.length);
            secretDiv = secretDiv.substr(0, secretDiv.length - 1);
            return(secretDiv);  
}  

getHostname();

Я переписал переменные так, чтобы они были более «читаемыми» человеком, но это делает работу лучше, чем ожидалось.

Норберт Борос
источник
2

Что ж, использование регулярного выражения будет намного проще:

    mainUrl = "http://www.mywebsite.com/mypath/to/folder";
    urlParts = /^(?:\w+\:\/\/)?([^\/]+)(.*)$/.exec(mainUrl);
    host = Fragment[1]; // www.mywebsite.com
Саурабх Мандел
источник
2
import URL from 'url';

const pathname = URL.parse(url).path;
console.log(url.replace(pathname, ''));

это заботится как о протоколе.

Стэнли Огуазу
источник
Действительно, этот модуль поставляется с NodeJS.
Джибе
1

Короче говоря, вы можете сделать это

var url = "http://www.someurl.com/support/feature"

function getDomain(url){
  domain=url.split("//")[1];
  return domain.split("/")[0];
}
eg:
  getDomain("http://www.example.com/page/1")

  output:
   "www.example.com"

Используйте вышеуказанную функцию, чтобы получить доменное имя

uzaif
источник
что проблема?
Узаиф
проблема в том, что не получится, если до этого не было косой черты?
Инструментарий
в вашем случае вам нужно проверить ?в строке вашего доменного имени и вместо return domain.split("/")[0]; этого return domain.split("?")[0];надеяться, что это сработает
uzaif
1

Parse-Urls - это библиотека JavaScript с самыми надежными шаблонами

Вот краткое изложение особенностей:

Глава 1. Нормализуйте или проанализируйте один URL

Глава 2. Извлечение всех URL

Глава 3. Извлечение URI с определенными именами

Глава 4. Извлечение всех нечетких URL

Глава 5. Выделите все URL в текстах

Глава 6. Извлечение всех URL в необработанном HTML или XML

Chamilyan
источник
0

Код:

var regex = /\w+.(com|co\.kr|be)/ig;
var urls = ['http://www.youtube.com/watch?v=ClkQA2Lb_iE',
            'http://youtu.be/ClkQA2Lb_iE',
            'http://www.example.com/12xy45',
            'http://example.com/random'];


$.each(urls, function(index, url) {
    var convertedUrl = url.match(regex);
    console.log(convertedUrl);
});

Результат:

youtube.com
youtu.be
example.com
example.com
Ёнджун Ким
источник
@ChristianTernus наоборот; OP упоминает регулярное выражение, и это довольно очевидно выражение регулярного выражения, разработанное для соответствия запрашиваемой части URL. Это не совсем правильно (например, это требует, www.хотя не все URL имеют этот компонент), но это, безусловно, ответ .
Кайл Стрэнд,
@KyleStrand Довольно очевидно, субъективное суждение; предоставление необработанного регулярного выражения в ответ на вопрос «Я ищу версию этого решения для JS / jQuery» не отвечает на вопрос.
Кристиан Тернус
Я ОП. В то время я был новым разработчиком, ища нестандартное решение в JS. Действительно, необработанная строка регулярного выражения без какого-либо контекста не помогла бы вообще. Плюс это неполно.
Чамильян
0

parse-domain - очень солидная легковесная библиотека

npm install parse-domain

const { fromUrl, parseDomain } = require("parse-domain");

Пример 1

parseDomain(fromUrl("http://www.example.com/12xy45"))
{ type: 'LISTED',
  hostname: 'www.example.com',
  labels: [ 'www', 'example', 'com' ],
  icann:
   { subDomains: [ 'www' ],
     domain: 'example',
     topLevelDomains: [ 'com' ] },
  subDomains: [ 'www' ],
  domain: 'example',
  topLevelDomains: [ 'com' ] }

Пример 2

parseDomain(fromUrl("http://subsub.sub.test.ExAmPlE.coM/12xy45"))
{ type: 'LISTED',
  hostname: 'subsub.sub.test.example.com',
  labels: [ 'subsub', 'sub', 'test', 'example', 'com' ],
  icann:
   { subDomains: [ 'subsub', 'sub', 'test' ],
     domain: 'example',
     topLevelDomains: [ 'com' ] },
  subDomains: [ 'subsub', 'sub', 'test' ],
  domain: 'example',
  topLevelDomains: [ 'com' ] }

Зачем?

В зависимости от варианта использования и объема я настоятельно рекомендую не решать эту проблему самостоятельно с помощью регулярных выражений или других средств манипулирования строками. Суть этой проблемы заключается в том, что вам необходимо знать все суффиксы gtld и cctld для правильного разбора строк url ​​на домен и поддомен, эти суффиксы регулярно обновляются. Это решаемая проблема, а не та, которую вы хотите решить самостоятельно (если вы не гуглите или что-то в этом роде). Если вам не нужно имя хоста или доменное имя в крайнем случае, не пытайтесь разобраться в этом.

Глен Томпсон
источник
Вероятно, это проблема среды / управления версиями, посмотрите на этот npmjs.com/package/parse-domain
Глен Томпсон
-1

Мой код выглядит так. Регулярные выражения могут принимать разные формы, и вот мои тестовые примеры, которые я считаю более масштабируемыми.

function extractUrlInfo(url){
  let reg = /^((?<protocol>http[s]?):\/\/)?(?<host>((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])|[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)))(\:(?<port>[0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/
  return reg.exec(url).groups
}

var url = "https://192.168.1.1:1234"
console.log(extractUrlInfo(url))
var url = "/programming/8498592/extract-hostname-name-from-string"
console.log(extractUrlInfo(url))

gao.xiangyang
источник
-6

Попробуйте код ниже для точного доменного имени, используя регулярное выражение,

String line = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";

  String pattern3="([\\w\\W]\\.)+(.*)?(\\.[\\w]+)";

  Pattern r = Pattern.compile(pattern3);


  Matcher m = r.matcher(line);
  if (m.find( )) {

    System.out.println("Found value: " + m.group(2) );
  } else {
     System.out.println("NO MATCH");
  }
I_Tech
источник
2
ОП искал ответ в JavaScript, а не в Java.
piersadrian