Витягнути ім'я хоста з рядка


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

Я хочу отримати два останніх інстанції, які вирішуються на домен www.example.comабо example.comдомен.

Я чув, що регулярний вираз виражається повільно, і це був би мій другий вираз регулярного вираження на сторінці, тому якщо все-таки це можна зробити без регулярного виразу, дайте мені знати.

Я шукаю JS / jQuery версію цього рішення.

Відповіді:


281

Рекомендую використовувати пакет npm psl (Список загальних суфіксів) . "Список загальнодоступних суфіксів" - це список усіх дійсних суфіксів і правил домену, не лише доменів верхнього рівня з кодом країни, а також символів unicode, які вважатимуться кореневим доменом (наприклад, www. 食 狮. 公司 .cn, bckobe .jp тощо). Детальніше про це читайте тут .

Спробуйте:

npm install --save psl

Тоді з моєю реалізацією "extraHostname" запустіть:

let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com

Я не можу використовувати пакет npm, тому нижче випробовується лише ExtraHostname.

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, дякую за повідомлення про помилку!


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

8
насправді я спробую рішення parseUri, але +1 для творчості.
Чамілян

11
@Chamilyan Я думаю, ви повинні прийняти цю відповідь. Це набагато крутіше і працює без зайвих :)
Ліпіс,

3
просто фій - це рішення не обробляє номери портів
Кайл

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
Chamilyan

1
Я використовую це в хромованому розширенні, тому наразі жодна підтримка 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

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, може, ти можеш легко вимагати ліб? 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 ( каніузи ). Використовуйте поліфункцію 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"
}

1
Зазвичай я сумую за низькими голосами відповідей, але ця відповідь змусила мене бути обережними. Чудово працює! Дякуємо @BlackDivine
Devaroop

Дякую, що знайшли час, щоб оцінити мої зусилля @Devaroop
BlackDivine

15

Якщо ви опинитесь на цій сторінці та шукаєте найкращий REGEX URL-адрес, спробуйте це:

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

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

Він працює для URL-адрес без http: //, з http, з https, з just // і також не захоплює шлях та шлях запиту.

Щасти


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. - З огляду
Лоуренс Айелло

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
}

не вдається при деякому досить простому розборі. Спробуйте getUrlParts('www.google.com')в консолі на цій сторінці.
Чамілян

@Chamilyan Це не URL, URL-адреси мають протокол. Однак я оновив код, щоб вирішити більш загальний випадок, тому, будь ласка, поверніть свій запис.
Уїтніленд

Я не проголосував за вас. Але я був би, якби в своєму оригінальному запитанні я спеціально не просив http: //
Чамілян

2
@Lee зазнає невдачі на цьому вході: має бути , але він виводить: в той час як це суб-домен (домени можуть мати кілька суб-домени). var url="https://mail.gggg.google.cn/link/link/link";domainrootgoogle.comgggg.google.cngggg
Жоден


4

Шукав рішення цієї проблеми сьогодні. Жодна з наведених відповідей, здавалося, не задовольняла. Я хотів рішення, яке могло б бути одним вкладишем, без умовної логіки та нічого, що повинно бути зафіксовано у функції.

Ось що я придумав, здається, працює дуже добре:

hostname = "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 ('.'). slice (-2). приєднатися ('.')
"http://example.com:1234".split("//").slice(-1) evidence0 SAMS.split(":") evidence0 kome.split('.').slice(-2 ). приєднатися ('.')
"http://www.example.com:1234" .split ("//") .slice (-1) [0] .split (":") [0] .split ('.'). slice ( -2). Приєднатися ('.')
"http://foo.www.example.com:1234" .split ("//") .slice (-1) [0] .split (":") [0] .split ('.'). зріз (-2). приєднатися ('.')

приємно, бо він розглядає випадок, коли www не має значення
Чамілян


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]+.)/,"");
}

тож я додаю тут коментарі: Цей код працює навіть із 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 десь.com

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

Оригінальний кредит надається на адресу: http://www.primaryobjects.com/CMS/Article145


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

3

Це не повна відповідь, але наведений нижче код повинен допомогти вам:

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

Я хотів би, щоб хтось створив код швидше, ніж мій. Це також допомагає покращити саморозуміння.


3

одна лінія з jquery

$('<a>').attr('href', document.location.href).prop('hostname');

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]+.)/,"");
}

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

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 Pretty, очевидно, є суб'єктивним судженням; надання необробленого регулярного виразу, коли його запитують "Я шукаю JS / jQuery версії цього рішення", не відповідає на qeaction.
Крістіан Терн

Я ОП. На той час я був новим розробником, який шукав рішення, що не вийшло в 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-адрес на домен та субдомени, ці суфікси регулярно оновлюються. Це вирішена проблема, а не та, яку ви хочете вирішити самостійно (якщо ви не Google або щось подібне). Якщо вам не потрібне ім'я хоста чи доменне ім'я, не намагайтеся проаналізувати вихід із цього.


Ймовірно, проблема з оточенням / версією
Глен Томпсон

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


-6

Спробуйте нижче код для точного доменного імені за допомогою regex,

Рядок рядка = " 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");
  }

2
OP шукав відповідь у JavaScript, а не на Java.
пристань
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.