Sé que esta es una publicación un poco antigua, pero a todas las expresiones regulares aquí les falta un componente muy importante: el soporte para nombres de dominio IDN.
Los nombres de dominio IDN comienzan con xn--. Permiten caracteres UTF-8 extendidos en nombres de dominio. Por ejemplo, ¿sabía que "♡ .com" es un nombre de dominio válido? ¡Sí, "love heart dot com"! Para validar el nombre de dominio, debe dejar que http://xn--c6h.com/ pase la validación.
Tenga en cuenta que para usar esta expresión regular, deberá convertir el dominio a minúsculas y también usar una biblioteca IDN para asegurarse de codificar los nombres de dominio en ACE (también conocido como "Codificación compatible con ASCII"). Una buena biblioteca es GNU-Libidn.
idn (1) es la interfaz de línea de comandos para la biblioteca de nombres de dominio internacionalizados. El siguiente ejemplo convierte el nombre de host en UTF-8 en codificación ACE. La URL resultante https: //nic.xn--flw351e/ se puede utilizar como equivalente codificado en ACE de https: // nic. 谷 歌 / .
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
Esta expresión regular mágica debería cubrir la mayoría de los dominios (aunque estoy seguro de que hay muchos casos extremos válidos que me he perdido):
^((?!-))(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,})$
Al elegir una expresión regular de validación de dominio, debería ver si el dominio coincide con lo siguiente:
- xn--stackoverflow.com
- stackoverflow.xn - com
- stackoverflow.co.uk
Si estos tres dominios no pasan, es posible que su expresión regular no permita dominios legítimos.
Revisa página de Soporte de nombres de dominio internacionalizados de la Guía del entorno de idiomas internacionales de Oracle para obtener más información.
No dude en probar la expresión regular aquí: http://www.regexr.com/3abjr
ICANN mantiene una lista de tlds que se han delegado que se puede utilizar para ver algunos ejemplos de dominios 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,})$
Esta expresión regular detendrá los dominios que tienen '-' al final de un nombre de host como marcados como válidos. Además, permite subdominios ilimitados.