¿Qué es una expresión regular que coincidirá con un nombre de dominio válido sin un subdominio?

En primer lugar, perdón por la 10.000ª pregunta de RegEx,

Me doy cuenta de que hay otras preguntas relacionadas con el dominio, pero la expresión regular no funciona correctamente, es demasiado compleja o para URL con subdominios, protocolos y rutas de archivos.

El mío es más simple, necesito validar un nombre de dominio:

google.com

stackoverflow.com

Entonces, un dominio en su forma más pura, ni siquiera un subdominio como www.

  1. Los personajes solo deben ser az | AZ | 0-9 y punto (.) Y punto (-)
  2. La parte del nombre de dominio no debe comenzar ni finalizar con el guión (-) (por ejemplo, -google-.com)
  3. La parte del nombre de dominio debe tener entre 1 y 63 caracteres de longitud
  4. La extensión (TLD) puede ser cualquier cosa bajo reglas # 1 por ahora, puedo validarlas contra una lista más adelante, debería ser de 1 o más caracteres, aunque

Editar: TLD es aparentemente 2-6 caracteres tal como está

no. 4 revisado: TLD debe etiquetarse como “subdominio” ya que debe incluir cosas como .co.uk – Me imagino que la única validación posible (aparte de verificar contra una lista) sería ‘después del primer punto debería haber uno o más personajes según las reglas n. ° 1

Muchas gracias, créanme, lo intenté!

Bueno, es bastante sencillo un poco más furtivo de lo que parece (ver comentarios), dados sus requisitos específicos:

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

Pero tenga en cuenta que esto rechazará una gran cantidad de dominios válidos.

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ías que “♡ .com” es un nombre de dominio válido? Sí, “corazón de amor punto com”! Para validar el nombre de dominio, debe permitir que http://xn--c6h.com/ apruebe 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 comando para la biblioteca de nombres de dominio internacionalizados. El siguiente ejemplo convierte el nombre de host en UTF-8 en encoding ACE. La URL resultante https: //nic.xn--flw351e/ se puede usar como equivalente codificado en ACE de https: // nic. 谷 歌 / .

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

Esta expresión regular mágica debería abarcar la mayoría de los dominios (aunque, estoy seguro de que hay muchos casos de borde 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}\.[az]{2,})$ 

Al elegir una expresión regular de validación de dominio, debería ver si el dominio coincide con lo siguiente:

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

Si estos tres dominios no pasan, ¡es posible que su expresión regular no permita dominios legítimos!

Consulte la 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.

Siéntase libre de probar la expresión regular aquí: http://www.regexr.com/3abjr

ICANN mantiene una lista de tlds que se han delegado, que se pueden usar 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\-]{1,61}|[a-z0-9-]{1,30}\.[az]{2,})$ 

Esta expresión regular detendrá los dominios que tienen ‘-‘ al final de un nombre de host como marcado como válido. Además, permite subdominios ilimitados.

Mi RegEx es el siguiente:

^[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})$

está bien para i.oh1.me y para wow.british-library.uk

UPD

Aquí está la regla actualizada

 ^(([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})$ 

Visualización de expresión regular

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

ahora comprueba - o _ en el principio o el final de la etiqueta del dominio.

Solo una pequeña corrección: la última parte debería ser hasta 6. Por lo tanto,

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

El TLD más largo es el museum (6 caracteres) – http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

Mi apuesta:

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

Explicado:

El nombre de dominio se crea a partir de segmentos. Aquí hay un segmento (excepto el final):

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

Puede tener 1-63 caracteres, no comienza o termina con ‘-‘.

Ahora agregue ‘.’ y repetir al menos una vez:

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

Luego adjunte el segmento final, que tiene de 2 a 63 caracteres de longitud:

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

Pruébelo aquí: http://regexr.com/3au3g

La respuesta aceptada no funciona para mí, prueba esto:

^ ((?! -) [A-Za-z0-9 -] {1,63} (?

Visite estos Casos de prueba unitarios para validación.

Esta respuesta es para nombres de dominio (incluidos los RR de servicio), no nombres de host (como un nombre de host de correo electrónico).

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

Es básicamente la respuesta de mkyong y además:

  • Longitud máxima de 255 octetos, incluidos los prefijos de longitud y la raíz nula.
  • Permitir el seguimiento '.' para la raíz dns explícita.
  • Permitir '_' principal para los RR de dominio de servicio, (errores: no aplica 15 caracteres máx. Para tags _ ni requiere al menos un dominio por encima de los RR del servicio)
  • Coincide con todos los TLD posibles.
  • No captura tags de subdominio.

Por partes

Lookahead, límite máximo de longitud entre ^ $ a 253 caracteres con literal final opcional '.'

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

Lookahead, el siguiente caracter no es '-' y no '_' sigue a ningún caracter antes del siguiente '.'. Es decir, hacer cumplir que el primer carácter de una etiqueta no es '-' y que solo el primer carácter puede ser '_'.

 (?!-|[^.]+_) 

Entre 1 y 63 de los caracteres permitidos por etiqueta.

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

Lookbehind, personaje anterior no '-'. Es decir, hacer cumplir que el último carácter de una etiqueta no es un '-'.

 (? 

Forzar un '.' al final de cada etiqueta, excepto la última, donde es opcional.

 (?:\.|$) 

Mayormente combinado desde arriba, esto requiere al menos dos niveles de dominio, lo cual no es del todo correcto, pero generalmente es una suposición razonable. Cambie de {2,} a + si desea permitir dominios de nivel superior (TLD) o subdominios relativos no calificados (por ejemplo, localhost, myrouter, a).

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

Unidad de pruebas para esta expresión.

Gracias por indicar la dirección correcta en soluciones de validación de nombres de dominio en otras respuestas. Los nombres de dominio se pueden validar de varias maneras.

Si necesita validar el dominio de IDN en su forma legible , regex \p{L} lo ayudará. Esto permite hacer coincidir cualquier personaje en cualquier idioma.

¡Tenga en cuenta que la última parte también puede contener guiones ! Como los nombres Chineese codificados con punycode pueden tener caracteres unicode en tld.

He llegado a una solución que coincidirá, por ejemplo:

  • google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • http://www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 心 中 中心. 中国
  • xn – fiqa61au8b7zsevnm8ak20mc4a87e.xn – fiqs8s

Regex es:

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

Revisa y sintoniza aquí

NOTA: Esta expresión regular es bastante permisiva, al igual que los nombres de dominio actuales permitidos.

ACTUALIZACIÓN : Aún más simplificado, ya que a-aA-Z\p{L} es lo mismo que simplemente \p{L}

NOTA 2: El único problema es que coincidirá con dominios con puntos dobles …, como masełk..owski.pl . Si alguien sabe cómo solucionar esto, por favor mejore.

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

[dominio – minúsculas y 0-9 solamente] [puede tener un guión] + [TLD – minúsculas solamente, debe tener entre 2 y 7 letras]
¡http://rubular.com/ es shiny para probar expresiones regulares!
Editar: Máximo de TLD actualizado a 7 caracteres para ‘.rentals’ como señaló Dan Caddigan.

No hay suficientes representantes para comentar. En respuesta a la solución de Paka, descubrí que necesitaba ajustar tres elementos:

  • El guión y el guión bajo se movieron debido a que el guión se interpreta como un rango (como en “0-9”)
  • Se agregó un punto y aparte para los nombres de dominio con muchos subdominios
  • Extendió la duración potencial de los TLD a 13

Antes 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,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$ 

Después:

 ^(([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})$ 
 ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]+(\.[a-zA-Z]+)$ 

Para nuevos gTLD

 /^((?!-)[\p{L}\p{N}-]+(? 

Aquí está el código completo con un ejemplo:

  
 ^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(? 

Gracias @mkyong por la base de mi respuesta. Lo he modificado para admitir tags más largas aceptables.

Además, "localhost" es técnicamente un nombre de dominio válido. Modificaré esta respuesta para acomodar nombres de dominio internacionalizados.

 /^((([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}) -> por aceptar solo dos caracteres.

  • ([0-9]{1,2}) -> por aceptar solo dos números

si algo excede más allá de dos ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]) esta expresión regular se encargará de eso.

Si queremos hacer la coincidencia por lo menos una vez, se usará.

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

Ejemplos que funcionan:

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

También funcionará para extensiones

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

Ejemplos que no funcionarán:

 -stack.com 

funcionará incluso con la extensión de dominio más larga ".versicherung"

    Intereting Posts