Regex para nome de domínio

Use /^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/ para verificar se uma string inteira é um nome de domínio válido. Cada exemplo abaixo foi testado contra o padrão, e você pode abri-lo no Regex Tester com os exemplos já carregados.

Atualizado em

/^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/
Abrir no Regex Tester
EntradaResultado
example.com✓ Corresponde
sub.example.co.uk✓ Corresponde
my-site.dev✓ Corresponde
-example.com✗ Não corresponde
example✗ Não corresponde
example-.com✗ Não corresponde
https://example.com✗ Não corresponde

Como o padrão funciona

ParteSignificado
[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?Um rótulo de 1 a 63 caracteres que não começa nem termina com hífen
\.Um ponto após cada rótulo
(?:…)+Um ou mais rótulos (subdomínios)
[A-Za-z]{2,}$O domínio de nível superior (TLD)

Exemplos de código

JavaScript

const re = /^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/;
re.test(value); // true or false

Python

import re

bool(re.fullmatch(r'(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,}', value))

PHP

preg_match('/^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/', $value) === 1;

Observações e limitações

Domínios internacionalizados precisam ser convertidos antes para a forma punycode (xn--…). Consulte os registros de um domínio com o DNS Lookup.

Perguntas frequentes

Qual é a regex para nome de domínio?
/^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,}$/ — ela corresponde à string inteira. Veja a tabela acima para entender o que cada parte faz.
Quais exemplos correspondem?
Dos exemplos testados, estes correspondem: example.com, sub.example.co.uk, my-site.dev. Os outros não.
Como testo essa regex?
Clique em “Abrir no Regex Tester” — o padrão, as flags e o texto de exemplo são carregados automaticamente, e as correspondências são destacadas conforme você edita.