Preciso validar um nome de domínio:
google.com
stackoverflow.com
Portanto, um domínio em sua forma mais bruta - nem mesmo um subdomínio como www.
- Os caracteres devem ser apenas az | AZ | 0-9 e ponto (.) E traço (-)
- A parte do nome do domínio não deve começar ou terminar com traço (-) (por exemplo, -google-.com)
- A parte do nome do domínio deve ter entre 1 e 63 caracteres
A extensão (TLD) pode ser qualquer coisa sob as regras nº 1 por enquanto. Posso validá-las em uma lista posteriormente, mas deve ter 1 ou mais caracteres.
Edit: TLD é aparentemente 2-6 caracteres, tal como está
não. 4 revisado: o TLD deve realmente ser rotulado como "subdomínio", pois deve incluir coisas como .co.uk - eu imaginaria que a única validação possível (além de verificar em uma lista) seria 'após o primeiro ponto, deve haver um ou mais personagens sob as regras # 1
Muito obrigado, acredite, eu tentei!
regex
validation
domain-name
Dominic
fonte
fonte
Respostas:
Bem, é
bem diretoum pouco mais furtivo do que parece (veja os comentários), considerando seus requisitos específicos:Mas observe que isso rejeitará muitos domínios válidos.
fonte
g.co
é um nome de domínio válido, masg
possui apenas um caractere./^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/
. Mas isso ainda rejeita toneladas de material válido ...Sei que este é um post antigo, mas todas as expressões regulares aqui estão faltando em um componente muito importante: o suporte a nomes de domínio IDN.
Os nomes de domínio IDN começam com xn--. Eles habilitam caracteres UTF-8 estendidos em nomes de domínio. Por exemplo, você sabia que "♡ .com" é um nome de domínio válido? Sim, "amor coração ponto com"! Para validar o nome de domínio, é necessário deixar http://xn--c6h.com/ passar na validação.
Observe que, para usar esse regex, você precisará converter o domínio para minúsculas e também usar uma biblioteca IDN para garantir a codificação de nomes de domínio para o ACE (também conhecido como "Codificação compatível com ASCII"). Uma boa biblioteca é o GNU-Libidn.
idn (1) é a interface da linha de comandos para a biblioteca de nomes de domínio internacionalizada. O exemplo a seguir converte o nome do host em UTF-8 em codificação ACE. O URL resultante https: //nic.xn--flw351e/ pode ser usado como equivalente codificado por ACE a https: // nic. 谷 歌 / .
Essa expressão regular mágica deve abranger a maioria dos domínios (embora eu tenha certeza de que há muitos casos válidos que perdi):
Ao escolher uma regex de validação de domínio, você deve ver se o domínio corresponde ao seguinte:
Se esses três domínios não forem aprovados, sua expressão regular poderá não estar permitindo domínios legítimos!
Confira a página Suporte a nomes de domínio internacionalizados no Guia de ambiente de idiomas internacional da Oracle para obter mais informações.
Sinta-se livre para experimentar o regex aqui: http://www.regexr.com/3abjr
A ICANN mantém uma lista de IDs delegados que podem ser usados para ver alguns exemplos de domínios de IDN.
Editar:
Essa expressão regular interrompe domínios que possuem '-' no final de um nome de host como marcados como válidos. Além disso, ele permite subdomínios ilimitados.
fonte
/^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{1,30})\.?[a-z]{2,})$/i
to.
( para. ) É um URL válido com conteúdo.to.
não é um nome de domínio totalmente qualificado. Se você deseja permitir domínios de nível superior, deve usar algo como^(((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.)?(x--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})\.?$
, mas esteja avisado, permitirá que as pessoas que colocam domínios comotest
ouna
também!invali.d
como um nome de domínio válido enquantoinvali.d.co.uk
é inválido.xn--stackoverflow.com
não é um nome válido, pois 'stackoverflow' não pode ser convertido do Punycode. Isso, no entanto, está além do que uma regex pode fazer. Como observação geral, osxn--[a-z0-9]+
rótulos seriam apenas para IDNs, enquantoxn--[a-z0-9]+\-[a-z0-9]+
indicam uma mistura de caracteres ASCII e não ASCIIMeu RegEx é o próximo:
^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$
tudo bem para o i.oh1.me e para o wow.british-library.uk
UPD
Aqui está a regra atualizada
https://www.debuggex.com/r/y4Xe_hDVO11bv1DV
agora verifique
-
ou_
no início ou no final do rótulo do domínio.fonte
{2,6}
critérios precisarão ser atualizados para o novo TLD. Provavelmente{2,}
.Minha aposta:
Explicado:
Nome de domínio é construído a partir de segmentos. Aqui está um segmento (exceto final):
Pode ter de 1 a 63 caracteres, não inicia nem termina com '-'.
Agora acrescente '.' e repita pelo menos uma vez:
Em seguida, anexe o segmento final, com 2 a 63 caracteres de comprimento:
Teste aqui: http://regexr.com/3au3g
fonte
Apenas uma pequena correção - a última parte deve ter até 6. Portanto,
O TLD mais longo é
museum
(6 caracteres) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domainsfonte
.photography
available
tlds atualmente não é uma prova do futuro.{2,63}
: consulte stackoverflow.com/questions/9238640/…A resposta aceita não está funcionando para mim, tente o seguinte:
Visite os casos de teste de unidade para validação.
fonte
{2,6}
para outra coisa e funcionará. Meu:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Esta resposta é para nomes de domínio (incluindo RRs de serviço), não para nomes de host (como um nome de host de email).
É basicamente a resposta de mkyong e, além disso:
Por peças
Atenção, limite o comprimento máximo entre ^ $ e 253 caracteres com literal à direita opcional '.'
Lookahead, o próximo caractere não é um '-' e nenhum '_' segue nenhum caractere antes do próximo '.'. Ou seja, imponha que o primeiro caractere de um rótulo não seja um '-' e apenas o primeiro caractere possa ser um '_'.
Entre 1 e 63 dos caracteres permitidos por rótulo.
Olhe para trás, o caractere anterior não '-'. Ou seja, imponha que o último caractere de um rótulo não seja um '-'.
Forçar um '.' no final de cada rótulo, exceto o último, onde é opcional.
Principalmente combinado acima, isso requer pelo menos dois níveis de domínio, o que não é muito correto, mas geralmente é uma suposição razoável. Mude de {2,} para + se desejar permitir TLDs ou subdomínios relativos não qualificados através (por exemplo, localhost, myrouter, para.)
Testes de unidade para esta expressão.
fonte
Obrigado por apontar a direção certa nas soluções de validação de nomes de domínio em outras respostas. Os nomes de domínio podem ser validados de várias maneiras.
Se você precisar validar o domínio IDN em sua forma legível por humanos , o regex
\p{L}
ajudará. Isso permite corresponder qualquer caractere em qualquer idioma.Observe que a última parte também pode conter hífens ! Como os nomes chineeses codificados com punycode podem ter caracteres unicode no tld.
Eu vim para a solução que corresponderá, por exemplo:
Regex é:
Verifique e sintonize aqui
NOTA: Essa regexp é bastante permissiva, assim como os nomes de domínio atuais são permitidos no conjunto de caracteres.
UPDATE : Ainda mais simplificado, como
a-aA-Z\p{L}
é o mesmo que apenas\p{L}
NOTA2: O único problema é que ele corresponderá domínios com pontos duplos nele ..., como
masełk..owski.pl
. Se alguém souber como consertar isso, melhore.fonte
[:alpha:]
e em[:digit]
vez de\p{L}
. Funciona bem.中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国
verifica como válido, mas após a conversão de IDN, são muitos bytes por rótulo. \ p {L} corresponde aos símbolos, e não aos bytes do código puny (que variam de símbolo para símbolo); portanto, a contagem repetida é inútil ao tentar limitar o tamanho pós-conversão.[domínio - letras minúsculas e somente 0-9] [pode ter um hífen] + [TLD - letras minúsculas, deve ter entre 2 e 7 letras]
http://rubular.com/ é brilhante para testar expressões regulares!
Editar: atualizado o TLD com no máximo 7 caracteres para '.rentals', como Dan Caddigan apontou.
fonte
.photography
seria inválido. Basta torná-lo caracteres ilimitados ou algo assim.Ainda não há representante suficiente para comentar. Em resposta à solução da paka, descobri que precisava ajustar três itens:
Antes:
Depois de:
fonte
Para novos gTLDs
fonte
Como já apontado, não é óbvio dizer subdomínios no sentido prático (por exemplo,
.co.uk
domínios). Usamos esse regex para validar domínios que ocorrem na natureza. Ele cobre todos os casos de uso prático que eu conheço. Novos são bem-vindos. De acordo com nossas diretrizes , evita grupos de não captura e correspondência gananciosa.^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$
Prova, explicação e exemplos: https://regex101.com/r/FLA9Bv/9 ( Observação: atualmente só funciona no Chrome porque o regex usa lookbehinds que são suportados apenas no ECMA2018 )
Existem duas abordagens para escolher ao validar domínios.
Correspondência FQDN pelos livros (definição teórica, raramente encontrada na prática):
Correspondência prática / conservadora de FQDN (definição prática, esperada e suportada na prática):
[a-zA-Z0-9.-]
fonte
fonte
Aqui está o código completo com o exemplo:
fonte
Obrigado @mkyong pela base da minha resposta. Eu o modifiquei para oferecer suporte a rótulos aceitáveis mais longos.
Além disso, "localhost" é tecnicamente um nome de domínio válido. Modificarei esta resposta para acomodar nomes de domínio internacionalizados.
fonte
([a-zA-Z]{1,2})
-> para aceitar apenas dois caracteres.([0-9]{1,2})
-> para aceitar apenas dois númerosse algo exceder além de dois,
([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])
este regex cuidará disso.Se quisermos fazer a correspondência por pelo menos uma vez
+
, será usado.fonte
Exemplos que funcionam:
Também funcionará para extensões
Exemplos que não funcionarão:
funcionará mesmo com a extensão de domínio mais longa
".versicherung"
fonte
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{0,30})\.[a-z-1-9]{2,})$
validará domínios como
яндекс.рф
após a codificação.https://regex101.com/r/Hf8wFM/1 - sandbox
fonte
O seguinte regex extrai o sub, root e tld de um determinado domínio:
Testado para os seguintes domínios:
fonte
Eu fiz o abaixo para buscar o domínio com o protocolo. Exemplo: https://www.facebook.com/profile/user/ ftp://182.282.34.337/movies/M
use o padrão Regex abaixo: [a-zA-Z0-9] +: //.*? /
você receberá a saída: https://www.facebook.com/ ftp://192.282.34.337/
fonte