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!
url.split('/')[2]
Desde independentemente do que escreverftp
,ftps
,https
, o nome de domínio será sempre no índice 2.return url.split('/')[2] || url.split('/')[0];
quais correspondências, se não houver protocolo.if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
Um truque interessante sem usar expressões regulares:
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.
fonte
hostname
, não deveria, se você deseja acessar tantohostname
oport
(como obtê-lodomain.sample:1234
apenas como acessoa.host
)Não há necessidade de analisar a string, basta passar seu URL como argumento para o
URL
construtor :fonte
Tente o seguinte:
Se você deseja excluir a porta do seu resultado, use esta expressão:
Editar: para impedir a correspondência de domínios específicos, use um indicador negativo.
(?!youtube.com)
fonte
?' (query) or
# `(fragmento). por exemplohttp://example.com?var=val
ouhttp://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)(?:www\.)?
no lookahead negativo.(?:www\.)?
à expressão regular assim:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
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.
fonte
URL()
ainda não é totalmente suportado. Confira: caniuse.com/#feat=urlResposta 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.hostname
para facilitar a leituraNa era Babel, a solução mais limpa e fácil é usar
URL.hostname
.URL.hostname
faz 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 :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.hostname
a legibilidade.fonte
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
Executando isso:
Resultado:
fonte
Se você terminar nesta página e estiver procurando o melhor REGEX de URLS, tente este:
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
fonte
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
Resultado
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.
fonte
getUrlParts('www.google.com')
em um console nesta página.var url="https://mail.gggg.google.cn/link/link/link";
odomainroot
deve ser,google.com
mas ele gera:gggg.google.cn
enquanto ogggg
é um subdomínio (os domínios podem ter vários subdomínios).Basta usar o construtor URL () :
fonte
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:
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":
fonte
Aqui está o one-liner do jQuery:
fonte
fonte
O crédito original é: http://www.primaryobjects.com/CMS/Article145
fonte
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.
fonte
Esta não é uma resposta completa, mas o código abaixo deve ajudá-lo:
Eu gostaria que alguém criasse um código mais rápido que o meu. Também ajuda a melhorar a mim mesmo.
fonte
on-line com jquery
fonte
fonte
Eu, pessoalmente, pesquisei bastante sobre esta solução, e a melhor que encontrei é na "verificação do navegador" do CloudFlare:
Reescrevi variáveis para que fique mais legível "humano", mas ele funciona melhor do que o esperado.
fonte
Bem, usar uma expressão regular será muito mais fácil:
fonte
isso cuida do protocolo.
fonte
em suma, você pode fazer assim
Use a função acima para obter o nome de domínio
fonte
?
na sua cadeia de nome de domínio e em vez dereturn domain.split("/")[0];
colocar essareturn domain.split("?")[0];
esperança que trabalharParse-Urls parece ser a biblioteca JavaScript com os padrões mais robustos
Aqui está um resumo dos recursos:
Capítulo 1. Normalize ou analise uma URL
Capítulo 2. Extrair todas as URLs
Capítulo 3. Extrair URIs com certos nomes
Capítulo 4. Extrair todas as URLs difusas
Capítulo 5. Destaque todas as URLs em textos
Capítulo 6. Extraia todas as URLs em HTML ou XML bruto
fonte
Código:
Resultado:
fonte
www.
que nem todos os URLs tenham esse componente), mas certamente é uma resposta .parse-domain - uma biblioteca leve muito sólida
npm install parse-domain
Exemplo 1
Exemplo 2
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.
fonte
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.
fonte
Experimente o código abaixo do nome de domínio exato usando regex,
String line = " http://www.youtube.com/watch?v=ClkQA2Lb_iE ";
fonte