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:
- xn--stackoverflow.com
- stackoverflow.xn - com
- 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.