Extrair nome do host da string


239

Gostaria de corresponder apenas à raiz de uma URL e não à URL inteira de uma sequência de texto. Dado:

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

Quero que as 2 últimas instâncias sejam resolvidas no domínio www.example.comou example.com.

Ouvi dizer que regex é lento e essa seria minha segunda expressão regex na página. Se houver alguma maneira de fazê-lo sem regex, avise-me.

Estou procurando uma versão JS / jQuery desta solução.

Respostas:


281

Eu recomendo usar o pacote npm psl (lista pública de sufixos) . A "Lista pública de sufixos" é uma lista de todos os sufixos e regras de domínio válidos, não apenas domínios de nível superior de código de país, mas também caracteres unicode que seriam considerados o domínio raiz (por exemplo, www. 食 狮. 公司 .cn, bckobe .jp etc.). Leia mais sobre isso aqui .

Experimentar:

npm install --save psl

Em seguida, com a minha implementação "extractHostname", execute:

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

Não posso usar um pacote npm, portanto, abaixo apenas os testes 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"));

Independentemente de ter o protocolo ou mesmo o número da porta, você pode extrair o domínio. Esta é uma solução muito simplificada e não regular, por isso acho que isso funcionará.

* Obrigado @Timmerz, @renoirb, @rineez, @BigDong, @ ra00l, @ILikeBeansTacos, @CharlesRobertson por suas sugestões! @ Ross-Allen, obrigado por relatar o bug!


3
Talvez seja melhor também oferecer suporte a qualquer tamanho de notação de protocolo. Uma melhoria poderia ser url.split('/')[2]Desde independentemente do que escrever ftp, ftps, https, o nome de domínio será sempre no índice 2.
— renoirb

1
dependendo do seu cenário, talvez seja necessário usar return url.split('/')[2] || url.split('/')[0];quais correspondências, se não houver protocolo.
— Timmerz 8/10

1
Por que vocês estão ignorando o fato de que essa função falhará ao retornar o nome de domínio para algumas entradas como "ftp.websitename.com/dir/file.txt"?
— rineez

1
@renoirb Com licença, como isso segue a digitação do Duck?
— rineez

6
Um deles: youtube.com/watch -> www.youtube.com é o subdomínio www do domínio youtube.com. Para remover o www extra, eu adicionei:if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
— ra00l

306

Um truque interessante sem usar expressões regulares:

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'

Coloque o que foi dito acima em uma função como a abaixo e você terá uma excelente maneira de roubar a parte do domínio de um URI.

function url_domain(data) {
  var    a      = document.createElement('a');
         a.href = data;
  return a.hostname;
}

8
na verdade, vou tentar a solução parseUri, mas +1 pela criatividade.
— Chamilyan

11
@Chamilyan Acho que você deveria aceitar essa resposta .. é muito, muito mais frio e funciona sem nada extra :)
— Lipis

3
Apenas FYI - esta solução não lidar com números de porta
— Kyle

1
@Kyle com certeza, se você está sugerindo que o número da porta deve fazer parte do hostname, não deveria, se você deseja acessar tanto hostnameo port(como obtê-lo domain.sample:1234apenas como acesso a.host)
— Filip Roséen - refp

46
Não use isso se precisar fazer rápido . É cerca de 40-60 vezes mais lento que o método de gilly3. Testado em jsperf: jsperf.com/hostname-from-url .
— Cprcrack #

138

Não há necessidade de analisar a string, basta passar seu URL como argumento para o URLconstrutor :

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

assert(hostname === 'www.youtube.com');

6
igual à resposta de @mc abaixo. Também dê uma olhada no comentário "novo URL () não funciona com o IE (IE11 testado)".
— Chamilyan

2
é provavelmente o mais fácil de trabalhar com a solução, porém, assim +1
— Chamilyan

1
Estou usando isso em uma extensão do Chrome, portanto, nenhum suporte do IE está bom comigo no momento.
— bodine 30/03

1
+1 Esta deve ser a resposta aceita. É rápido, confiável, funciona em todos os navegadores modernos, não depende de biblioteca externa e é fácil de entender (ao contrário das soluções regex). Eu também suporia que é muito rápido, uma vez que está no cerne do que todo navegador faz (embora não seja muito importante).
— Johndodo 10/03/19

128

Tente o seguinte:

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

Se você deseja excluir a porta do seu resultado, use esta expressão:

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

Editar: para impedir a correspondência de domínios específicos, use um indicador negativo.(?!youtube.com)

/^https?\:\/\/(?!(?:www\.)?(?:youtube\.com|youtu\.be))([^\/:?#]+)(?:[\/:?#]|$)/i

3
Não se esqueça de formatos, tais como protocolo: // usuário: senha @ host: port / path / to / resource ...
— Andrew White

1
Feche, mas uma URL pode não ter caminho e a parte do host pode terminar em um ?' (query) or # `(fragmento). por exemplo http://example.com?var=valou http://example.com#fragment. Assim, a regex correto deve ser algo como: /^https?\:\/\/([^\/?#]+)/. Fora isso, você terá a minha +1 (esta é a solução mais rápida)
— Ridgerunner

2
Você pode adicionar um opcional (?:www\.)?no lookahead negativo.
— Ridgerunner

3
+1 porque é extremamente rápido, o que é um requisito no meu caso
— cprcrack 5/11/2013

8
@FellowStranger - Adicione (?:www\.)?à expressão regular assim:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
— gilly3

36

A análise de um URL pode ser complicada, pois você pode ter números de porta e caracteres especiais. Como tal, recomendo usar algo como parseUri para fazer isso por você. Duvido que o desempenho seja um problema, a menos que você esteja analisando centenas de URLs.


12
Não use isso se precisar fazer rápido . Por apenas obter o nome do host, é cerca de 40 a 60 vezes mais lento que o método de gilly3. Testado em jsperf: jsperf.com/hostname-from-url .
— Cprcrack #

Aqui está um URL atualizado (o outro retorna 404 não encontrado): javascriptoo.com/application/html/js/franzenzenhofer/parseUri/…
— ub3rst4r 10/10/14

@BigDong talvez você possa facilmente exigir a lib? nodejs.org/api/…
— mc.

2
Infelizmente, o URL NÃO é suportado no IE10.
— advncd

1
URL()ainda não é totalmente suportado. Confira: caniuse.com/#feat=url
— Kousha

34

Resposta 2020

Você não precisa de nenhuma dependência extra para isso! Dependendo se você precisa otimizar o desempenho ou não, existem duas boas soluções:

Use URL.hostnamepara facilitar a leitura

Na era Babel, a solução mais limpa e fácil é usar 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.hostnamefaz parte da API da URL , suportada por todos os principais navegadores, exceto o IE ( caniuse ). Use um polyfill de URL se precisar oferecer suporte a navegadores herdados.

O uso desta solução também dará acesso a outras propriedades e métodos de URL . Isso será útil se você também desejar extrair o nome do caminho da URL ou os parâmetros da string de consulta , por exemplo.


Use RegEx para obter desempenho

URL.hostnameé mais rápido do que usar a solução âncora ou parseUri . No entanto, ainda é muito mais lento que o regex de 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"));

Teste você mesmo neste jsPerf

Se você precisar processar um número muito grande de URLs (onde o desempenho seria um fator), recomendo usar esta solução. Caso contrário, escolha URL.hostnamea legibilidade.


15

Tentei usar as soluções Given, a escolhida foi um exagero para o meu propósito e "Criando um elemento" é uma bagunça para mim.

Ainda não está pronto para o Port in URL. Espero que alguém ache útil

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

Executando isso:

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

Resultado:

Object {
    domain : "www.facebook.com",
    host : "facebook",
    path : "100003379429021_356001651189146",
    protocol : "https",
    subdomain : "www",
    tld : "com"
}

1
Normalmente, sinto falta das respostas com baixa votação, mas essa resposta me deixou cauteloso. Funciona bem! Obrigado @BlackDivine
— Devaroop

Obrigado por dedicar um tempo para apreciar meu esforço @Devaroop
— BlackDivine

15

Se você terminar nesta página e estiver procurando o melhor REGEX de URLS, tente este:

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

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

Ele funciona para URLs sem http: //, com http, com https, com apenas // e também não pega o caminho nem o caminho da consulta.

Boa sorte


Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada. - Do comentário
— Lawrence Aiello 11/11

1
Editado e enviado o regex :)
— Luis Lopes

6

Todas as propriedades de URL, sem dependências, sem JQuery, fáceis de entender

Esta solução fornece sua resposta, além de propriedades adicionais. Não é necessário JQuery ou outras dependências, cole e vá.

Uso

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

Resultado

{
  "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"
    }
  ]
}

Código
O código foi projetado para ser fácil de entender e não super rápido. Ele pode ser chamado facilmente 100 vezes por segundo, portanto, é ótimo para front-end ou para alguns usos de servidor, mas não para alta taxa de transferência de volume.

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
}

falha em algumas análises bastante simples. Tente getUrlParts('www.google.com')em um console nesta página.
— Chamilyan

@ Chamilyan Isso não é um URL, o URL tem um protocolo. No entanto, eu atualizei o código para lidar com o caso mais geral, então retire seu voto negativo.
— whitneyland

Eu não votei em você. Mas eu teria se não estivesse pedindo especificamente http: // na minha pergunta original.
— 21817 Chamillyan

2
@ Lee falha nesta entrada: var url="https://mail.gggg.google.cn/link/link/link";o domainrootdeve ser, google.commas ele gera: gggg.google.cnenquanto o ggggé um subdomínio (os domínios podem ter vários subdomínios).
— Nenhum


4

Estava procurando uma solução para esse problema hoje. Nenhuma das respostas acima pareceu satisfazer. Eu queria uma solução que pudesse ser um liner, nenhuma lógica condicional e nada que tivesse que ser envolvido em uma função.

Aqui está o que eu criei, parece funcionar muito bem:

hostname = "http://www.example.com:1234"
hostname.split ("//"). fatia (-1) [0]. divisão (":") [0]. divisão ('.'). fatia (-2). junta ('.') // dá "example.com"

Pode parecer complicado à primeira vista, mas funciona de maneira bem simples; a chave está usando 'fatia (-n)' em alguns lugares onde a parte boa precisa ser puxada do final da matriz dividida (e [0] para sair da frente da matriz dividida).

Cada um desses testes retorna "example.com":

"http://example.com" .split ("//") .slice (-1) [0] .split (":") [0] .split ('.'). fatia (-2). Junte-se('.')
"http://example.com:1234".split("//").slice(-1)[0}.split(":")[0}.split('.').slice(-2 ).Junte-se('.')
"http://www.example.com:1234" .split ("//") .slice (-1) [0] .split (":") [0] .split ('.'). slice ( -2) .join ('.')
"http://foo.www.example.com:1234" .split ("//") .slice (-1) [0] .split (":") [0] .split ('.'). fatia (-2) .join ('.')

bom porque ele lida com um caso onde www é irrelevante
— Chamilyan

4

Aqui está o one-liner do jQuery:

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

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

assim que eu adicionar comentários aqui: Esse código funciona mesmo com o URL que começa a partir // ou ter erros de sintaxe como qqq.qqq.qqq & teste = 2 ou ter consulta param com URL como 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];
}

O código acima analisará com êxito os nomes de host para os seguintes URLs de exemplo:

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 algures.com

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

O crédito original é: http://www.primaryobjects.com/CMS/Article145


3

Ok, eu sei que essa é uma pergunta antiga, mas eu fiz um analisador de URL supereficiente, então pensei em compartilhá-lo.

Como você pode ver, a estrutura da função é muito estranha, mas é para eficiência. Nenhuma função de protótipo é usada, a sequência não é iterada mais de uma vez e nenhum caractere é processado mais do que o necessário.

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

Esta não é uma resposta completa, mas o código abaixo deve ajudá-lo:

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

Eu gostaria que alguém criasse um código mais rápido que o meu. Também ajuda a melhorar a mim mesmo.


3

on-line com 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

Eu, pessoalmente, pesquisei bastante sobre esta solução, e a melhor que encontrei é na "verificação do navegador" do 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();

Reescrevi variáveis ​​para que fique mais legível "humano", mas ele funciona melhor do que o esperado.


2

Bem, usar uma expressão regular será muito mais fácil:

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

isso cuida do protocolo.


De fato, este módulo é fornecido com o NodeJS.
— djibe

1

em suma, você pode fazer assim

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"

Use a função acima para obter o nome de domínio


o que é problema?
— Uzaif 15/05

o problema é que não funcionará se não houver barra antes?
— Toolkit

no seu caso, você precisa verificar se há ?na sua cadeia de nome de domínio e em vez de return domain.split("/")[0]; colocar essa return domain.split("?")[0];esperança que trabalhar
— uzaif


0

Código:

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

Resultado:

youtube.com
youtu.be
example.com
example.com

@ChristianTernus Pelo contrário; o OP mencionou regex, e essa é obviamente uma expressão de regex projetada para corresponder à parte solicitada de um URL. Não está totalmente correto (por exemplo, exige www.que nem todos os URLs tenham esse componente), mas certamente é uma resposta .
— Kyle Strand

@KyleStrand Muito obviamente é um julgamento subjetivo; fornecer um regex bruto quando perguntado "Estou procurando uma versão JS / jQuery desta solução" não responde à pergunta.
— Christian Ternus 8/09/16

Eu sou o OP. Eu era um novo desenvolvedor na época procurando uma solução pronta para uso em JS. De fato, uma string regex bruta sem qualquer contexto não teria ajudado. Além disso, está incompleto.
— Chamilyan 8/09/16

0

parse-domain - uma biblioteca leve muito sólida

npm install parse-domain

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

Exemplo 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' ] }

Exemplo 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' ] }

Por quê?

Dependendo do caso de uso e do volume, recomendo fortemente que você não resolva esse problema usando regex ou outros meios de manipulação de cadeia. O principal desse problema é que você precisa conhecer todos os sufixos gtld e cctld para analisar adequadamente as seqüências de URL em domínio e subdomínios; esses sufixos são atualizados regularmente. Este é um problema resolvido e não o que você deseja resolver (a menos que você seja o Google ou algo assim). A menos que você precise do nome do host ou do domínio em uma pitada, não tente analisar esse caminho.


Provavelmente é um problema de ambiente / controle de versão, veja este npmjs.com/package/parse-domain
— Glen Thompson

-1

Meu código fica assim. Expressões regulares podem vir de várias formas, e aqui estão os meus casos de teste: acho que é mais escalável.

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

Experimente o código abaixo do nome de domínio exato usando regex,

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

2
A OP estava procurando uma resposta em JavaScript, não em Java.
— Piersadrian
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.