Solución:
La respuesta aceptada es incompleta / incorrecta.
El patrón de expresiones regulares;
-
no debe validar dominios como:
-domain.com
,domain--.com
,-domain-.-.com
,domain.000
, etc … -
deberían validar dominios como:
schools.k12
,newTLD.clothing
,good.photography
, etc …
Después de algunas investigaciones adicionales; A continuación se muestra el patrón más correcto, en varios idiomas y compacto que se me ocurrió:
^(?!-)(?:(?:[a-zA-Zd][a-zA-Zd-]{0,61})?[a-zA-Zd].){1,126}(?!d+)[a-zA-Zd]{1,63}$
Este patrón cumple con la mayoría * de las reglas definidas en las especificaciones:
- Cada etiqueta / nivel (dividido por un punto) puede contener hasta 63 caracteres.
- El nombre de dominio completo puede tener hasta 127 niveles.
- El nombre de dominio completo no puede exceder la longitud de 253 caracteres en su representación textual.
- Cada etiqueta puede constar de letras, dígitos y guiones.
- Las etiquetas no pueden comienzo o fin con un guion.
- El dominio de nivel superior (extensión) no se puede todo numérico.
Nota 1: La verificación de la longitud completa del dominio no está incluida en la expresión regular. Debería comprobarse simplemente con métodos nativos, por ejemplo strlen(domain) <= 253
.
Nota 2: Este patrón funciona con la mayoría de los lenguajes, incluidos PHP, Javascript, Python, etc.
Ver DEMO aquí (para JS, PHP, Python)
Más información:
-
La expresión regular anterior no admite IDN.
-
No hay ninguna especificación que diga que la extensión (TLD) debe tener entre 2 y 6 caracteres. En realidad, admite 63 caracteres. Ver la corriente Lista de TLD aquí. Además, algunas redes utilizan internamente TLD personalizados / pseudo.
-
Las autoridades de registro pueden imponer algunas reglas específicas adicionales que no se admiten explícitamente en esta expresión regular. Por ejemplo,
.CO.UK
y.ORG.UK
debe tener al menos 3 caracteres, pero menos de 23, sin incluir la extensión. Este tipo de reglas no son estándar y están sujetas a cambios. No los implemente si no puede mantenerlos. -
Las expresiones regulares son excelentes, pero no la mejor solución eficaz y eficaz para todos los problemas. Por lo tanto, se debe usar un analizador de URL nativo en su lugar, siempre que sea posible. por ejemplo, Python
urlparse()
método o PHPparse_url()
método… -
Después de todo, esto es solo una validación de formato. ¡Una prueba de expresiones regulares no confirma que un nombre de dominio esté realmente configurado / exista! Debe probar la existencia haciendo una solicitud.
Especificaciones y referencias:
- IETF: RFC1035
- IETF: RFC1123
- IETF: RFC2181
- IETF: RFC952
- Wikipedia: sistema de nombres de dominio
ACTUALIZAR (21/12/2019): Guión inicial fijo con subdominios.
Qué tal si:
^(?:[-A-Za-z0-9]+.)+[A-Za-z]{2,6}$