O que é uma expressão regular que corresponderá a um nome de domínio válido sem um subdomínio?

123

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.

  1. Os caracteres devem ser apenas az | AZ | 0-9 e ponto (.) E traço (-)
  2. A parte do nome do domínio não deve começar ou terminar com traço (-) (por exemplo, -google-.com)
  3. A parte do nome do domínio deve ter entre 1 e 63 caracteres
  4. 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!

Dominic
fonte
1
Pode não ser de todo útil. Quando se trata de google.co.uk e de alguns domínios japoneses, tenho certeza que você precisará pensar duas vezes antes de usar o regex para isso. Meu pensamento pessoal é que o regex não é suficiente para validar um domínio para um domínio da vida real. FYI, aqui está uma lista quase completa de DPNs e código do país lista de domínios de segundo nível: static.ayesh.me/misc/SO/tlds.txt
Ayesh K
1
Veja minha resposta para a pergunta relacionada sobre validação de nome de host .
SAM
2
Muitas vezes esquecido: para nomes de domínio totalmente qualificados, você deve corresponder a um período após o tld.
22413 schmijos
1
tem sido de 4 anos, agora a contagem é de até 89.000
mydoglixu
1
Algumas dessas respostas são muito boas, mas há outra boa resposta a essa outra pergunta que vale a pena dar uma olhada.
craftworkgames

Respostas:

49

Bem, é bem direto um pouco mais furtivo do que parece (veja os comentários), considerando seus requisitos específicos:

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

Mas observe que isso rejeitará muitos domínios válidos.

Cameron
fonte
Agradecimentos agradáveis ​​este parece estar trabalhando. Que tipo de domínios não serão aprovados na validação?
Dominic
12
@infensus - Embora este regex esteja correto, dadas as suas especificações, elas estão erradas. g.coé um nome de domínio válido, mas gpossui apenas um caractere.
24412 sch
3
Isso deve corresponder a todos os casos que eu penso: ^ ([a-z0-9]) (([a-z0-9 -] {1,61})? [A-z0-9] {1})? (\. [a-z0-9] (([a-z0-9 -] {1,61})? [a-z0-9] {1})?)? (\. [a-zA-Z] {2 , 4}) + $
transilvlad
1
x.com não passaria aqui
Neil McGuigan
4
@ Neil: Você está certo. A pergunta original solicitava de 3 a 63 caracteres (consulte a edição 3). Ele pode ser alterado para suportar domínios de um caráter bastante facilidade: /^[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 ...
Cameron
84

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. 谷 歌 / .

  $ idn --quiet -a nic.谷歌
  nic.xn--flw351e

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

^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$

Ao escolher uma regex de validação de domínio, você deve ver se o domínio corresponde ao seguinte:

  1. xn--stackoverflow.com
  2. stackoverflow.xn - com
  3. stackoverflow.co.uk

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:

 ^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$

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.

Tim Groeneveld
fonte
1
Observe que isso suportará apenas no máximo um subdomínio; qualquer coisa além disso resultará em false. Não é algo com o qual você se /^((?!-))(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
sinta culpado
1
Mas os Tlds solitários não estão funcionando :( Por exemplo to.( para. ) É um URL válido com conteúdo.
iiic
@iiic, sim, mas 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 como testou natambém!
amigos estão dizendo sobre tim
Ele aceita invali.dcomo um nome de domínio válido enquantoinvali.d.co.uk é inválido.
Pawel Krakowiak
1
Note-se que xn--stackoverflow.comnã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, os xn--[a-z0-9]+rótulos seriam apenas para IDNs, enquanto xn--[a-z0-9]+\-[a-z0-9]+indicam uma mistura de caracteres ASCII e não ASCII
Marcus
50

Meu 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

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Visualização de expressão regular

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

agora verifique -ou _no início ou no final do rótulo do domínio.

paka
fonte
9
Parece muito bom, mas os {2,6}critérios precisarão ser atualizados para o novo TLD. Provavelmente {2,}.
jwatts1980
@ jwatts1980 há exemplos de tais zonas? ou você quer dizer possíveis zonas futuras?
paka
1
Aqui está um artigo que discute as próximas mudanças, com exemplos e links para recursos relacionados: zdnet.com/...
jwatts1980
1
Por que ([a-zA-Z] {1} [a-zA-Z] {1}) e não ([a-zA-Z] {2})?
Anton
3
a última parte com as duas alternativas também está errada: existem ccTLDs (duas letras) que aceitam sub-rótulos de IDNA. Agora também existem rótulos de TLDs que já usam rótulos de IDNA. Você não deve especificar um caso especial para o último rótulo que não é diferente dos outros (e agora possui muitas extensões adicionadas com comprimentos variáveis, apenas como todos os outros rótulos nos subdomínios. Observe que os rótulos do IDNA também podem aparecer com código de punição (nesse caso, haverá "- - "um segmento no rótulo, o único caso em que" - "é permitido nos rótulos. Finalmente, o sublinhado é inválido em todos os lugares em todos os rótulos.
verdy_p 06/12/2015
24

Minha aposta:

^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$

Explicado:

Nome de domínio é construído a partir de segmentos. Aqui está um segmento (exceto final):

[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?

Pode ter de 1 a 63 caracteres, não inicia nem termina com '-'.

Agora acrescente '.' e repita pelo menos uma vez:

(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+

Em seguida, anexe o segmento final, com 2 a 63 caracteres de comprimento:

[a-z0-9][a-z0-9-]{0,61}[a-z0-9]

Teste aqui: http://regexr.com/3au3g

Yaroslav Stavnichiy
fonte
@GaneshBabu O que você quer dizer com correspondências exatas?
Yaroslav Stavnichiy
1
Todas as outras respostas não funcionaram para mim, mas esta funcionou.
Danny Coulombe
Eu tinha um requisito semelhante, onde eu queria evitar ponto e vírgula e vírgula no final. Tentei muito, mas sem sucesso abaixo é o Regex. Estou usando const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9])? \.) + [A-Za-z0-9] [A-Za-z0-9 -] { 0,61} [A-Za-z0-9] / g; Bem, valida se eu usar, e; no meio, mas falha no final para vliadate.
Harry
Encontrei vários domínios que devem ser válidos, mas são inválidos no seu regex. Por exemplo, редбулл.москва é um domínio válido ou também редбулл.рф e 红色 的 公牛. 中国
pubkey
1
@pubkey, você precisa converter esses nomes de domínio em punycode . O nome real de редбулл.москва é xn - 90afc0aazy.xn - 80adxhks E meu regex corresponde a ele.
Yaroslav Stavnichiy
13

Apenas uma pequena correção - a última parte deve ter até 6. Portanto,

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

O TLD mais longo é museum(6 caracteres) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

ahadinyoto
fonte
3
Nota: Isso não passará o nome de domínio válido (ainda raro) www.my---domain.com
Chris Bier
17
Não cortá-la com o novo TLD, por exemplo.photography
Sam Figueroa
2
@SamFigueroa Você só precisa modificar o comprimento dele #
Steel Brain
3
não deve haver uma verificação para o TLD, não é diferente dos subdomínios. E basear o regex em availabletlds atualmente não é uma prova do futuro.
Loïc Faure-Lacroix
1
Sugira que o último bit seja {2,63}: consulte stackoverflow.com/questions/9238640/…
Eric Dobbs
13

A resposta aceita não está funcionando para mim, tente o seguinte:

^ ((?! -) [A-Za-z0-9 -] {1,63} (? <! -) \.) + [A-Za-z] {2,6} $

Visite os casos de teste de unidade para validação.

mkyong
fonte
4
não há suporte para novos nomes já TLD como .Audio, .photography, e mais destes ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000
@ mrbinky3000 Basta alterar o último {2,6}para outra coisa e funcionará. Meu:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
@Mygod seu regex contém algum lixo largura de zero após o último ponto de interrogação, para que qualquer pessoa copiá-lo vai ser desagradavelmente surpreendido
MightyPork
1
@MightyPork Você está certo! Desculpe, aqui está uma (limpa) versão:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
Muito agradável. Infelizmente, expressões lookbehind não são válidas em JavaScript. : /
PhiLho
13

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

^(?=.{1,253}\.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}$

É basicamente a resposta de mkyong e, além disso:

  • Comprimento máximo de 255 octetos, incluindo prefixos de comprimento e raiz nula.
  • Permitir à direita '.' para raiz dns explícita.
  • Permitir '_' para RRs de domínio de serviço (erros: não impõe 15 char max para _ labels, nem exige pelo menos um domínio acima dos RRs de serviço)
  • Corresponde a todos os TLDs possíveis.
  • Não captura rótulos de subdomínio.

Por peças

Atenção, limite o comprimento máximo entre ^ $ e 253 caracteres com literal à direita opcional '.'

(?=.{1,253}\.?$)

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.

[A-Za-z0-9-_]{1,63}

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

(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}

Testes de unidade para esta expressão.

Andrew Domaszek
fonte
1
Obrigado! Este é o melhor regex aqui. Sua explicação completa e teste de unidade são um bônus.
naudster
O que significa "RR"?
veículo com rodas
Registro de Recurso. Geralmente, um campo de texto ou informações que informa como interagir com um serviço.
Andrew Domaszek
Este regex não está correto. Por exemplo, o domínio redbull. 移动 é válido, mas o regex não corresponde.
pubkey 15/06
Converta para punycode primeiro e depois faça a correspondência. Os limites de comprimento na versão pré-punycode são realmente difíceis de implementar.
Andrew Domaszek 15/06
8

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:

  • google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 网络 信息 中心.
  • xn - fiqa61au8b7zsevnm8ak20mc4a87e.xn - fiqs8s

Regex é:

^[0-9\p{L}][0-9\p{L}-\.]{1,61}[0-9\p{L}]\.[0-9\p{L}][\p{L}-]*[0-9\p{L}]+$

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.

PeterM
fonte
Podemos apenas usar [:alpha:]e em [:digit]vez de \p{L}. Funciona bem.
Puchu
Você não pode validar um IDN dessa maneira sem primeiro convertê-lo em punycode. Por exemplo, com seu expr, 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国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.
Andrew Domaszek
Bom ponto, cada parte é limitada a 64 bytes. No entanto, não podemos verificá-lo com o RegExp, portanto, mais etapas de validação são necessárias usando o decodificador punycode - que falhará com o seu exemplo de hostname. O chinês deve estar louco por essa limitação.
#
7
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[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.

Chris
fonte
1
Por que limitar TLDs? Agora .photographyseria inválido. Basta torná-lo caracteres ilimitados ou algo assim.
adriaan
5

Ainda não há representante suficiente para comentar. Em resposta à solução da paka, descobri que precisava ajustar três itens:

  • O traço e o sublinhado foram movidos devido ao fato de o traço ser interpretado como um intervalo (como em "0-9")
  • Foi adicionado um ponto final para nomes de domínio com muitos subdomínios
  • Ampliou a extensão potencial para os TLDs para 13

Antes:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Depois de:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_\.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$
zaTricky
fonte
3

Para novos gTLDs

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu
Ben Keil
fonte
2
Por favor, dê-nos mais alguns detalhes, o que você responde faz melhor do que os outros? O que você combina mais? Edite sua postagem diretamente para adicionar as informações.
Sven R.
Como eu escrevi: novos gTLDs. Domínios com caracteres unicode e também TLDs unicode.
21716 Ben Keil
1
@BenKeil: O que é essa parte sobre: (<-?!)
jor
@jor que é negativo, olhe para trás. Verifique isso em shortcutfoo.com/app/dojos/regex/cheatsheet #
Muhammad Faizan
3

Como já apontado, não é óbvio dizer subdomínios no sentido prático (por exemplo, .co.ukdomí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):

  • comprimento máximo de 253 caracteres (conforme RFC-1035 / 3.1 , RFC-2181/11 )
  • comprimento máximo de 63 caracteres por etiqueta (conforme RFC-1035 / 3.1 , RFC-2181/11 )
  • quaisquer caracteres são permitidos (conforme RFC-2181/11 )
  • Os DPNs não podem ser totalmente numéricos (conforme RFC-3696/2 )
  • Os FQDNs podem ser gravados em um formulário completo, que inclui a zona raiz (o ponto à direita)

Correspondência prática / conservadora de FQDN (definição prática, esperada e suportada na prática):

  • pelos livros que correspondem às seguintes exceções / adições
  • caracteres válidos: [a-zA-Z0-9.-]
  • os rótulos não podem começar ou terminar com hífens (conforme RFC-952 e RFC-1123 / 2.1 )
  • O comprimento mínimo do TLD é de 2 caracteres, o comprimento máximo é de 24 caracteres, de acordo com os registros existentes atualmente
  • não corresponde ao ponto à direita
thisismydesign
fonte
2
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]+(\.[a-zA-Z]+)$
Usuário desconhecido
fonte
5
-1 para a adição de {2,4}. É possível ter TLDs de caractere único (no entanto, não há atualmente nenhum na raiz). E o .mobile? .associados? Ambos são TLDs válidos e seriam rejeitados por este regex. data.iana.org/TLD/tlds-alpha-by-domain.txt
Tim Groeneveld
2

Aqui está o código completo com o exemplo:

<?php
function is_domain($url)
{
    $parse = parse_url($url);
    if (isset($parse['host'])) {
        $domain = $parse['host'];
    } else {
        $domain = $url;
    }

    return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
}

echo is_domain('example.com'); //true
echo is_domain('https://example.com'); //true
echo is_domain('https://.example.com'); //false
echo is_domain('https://localhost'); //false
Maulik Gangani
fonte
2
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,253})$

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.

Nate Watson
fonte
0
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))\.)+[a-zA-Z]{2,6}$/
  • ([a-zA-Z]{1,2}) -> para aceitar apenas dois caracteres.

  • ([0-9]{1,2})-> para aceitar apenas dois números

se 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.

priya
fonte
0

^ [a-zA-Z0-9] [- a-zA-Z0-9] + [a-zA-Z0-9]. [az] {2,3} (. [az] {2,3}) ? (. [az] {2,3})? $

Exemplos que funcionam:

stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com

Também funcionará para extensões

.com.uk
.co.in
.uk.edu.in

Exemplos que não funcionarão:

-stack.com

funcionará mesmo com a extensão de domínio mais longa ".versicherung"

Khan segue
fonte
0
  • ^((?!-))(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

Danila Kulakov
fonte
0

O seguinte regex extrai o sub, root e tld de um determinado domínio:

^(?<domain>(?<domain_sub>(?:[^\/\"\]:\.\s\|\-][^\/\"\]:\.\s\|]*?\.)*?)(?<domain_root>[^\/\"\]:\s\.\|\n]+\.(?<domain_tld>(?:xn--)?[\w-]{2,7}(?:\.[a-zA-Z-]{2,3})*)))$

Testado para os seguintes domínios:

* stack.com
* sta-ck.com
* sta---ck.com
* 9sta--ck.com
* sta--ck9.com
* stack99.com
* 99stack.com
* sta99ck.com
* google.com.uk
* google.co.in

* google.com
* masełkowski.pl
* maselkowski.pl
* m.maselkowski.pl
* www.masełkowski.pl.com
* xn--masekowski-d0b.pl
* xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

* xn--stackoverflow.com
* stackoverflow.xn--com
* stackoverflow.co.uk
landen99
fonte