Validación de nombre de dominio completamente calificado

¿Hay alguna manera rápida y sucia de validar si se ingresó el FQDN correcto? Tenga en cuenta que no hay servidor DNS ni conexión a Internet, por lo que la validación debe hacerse a través de regex / awk / sed.

¿Algunas ideas?

Ahora es más difícil, con nombres de dominio internacionalizados y varios miles (!) De TLD nuevos.

La parte fácil es que aún puedes dividir los componentes en “.”.

Necesitas una lista de TLDs registrables. Hay un sitio para eso:

https://publicsuffix.org/list/effective_tld_names.dat

Solo necesita verificar los reconocidos por ICANN. Tenga en cuenta que un TLD registrable puede tener más de un componente, como “co.uk”.

Luego está IDN y punycode. Los dominios son Unicode ahora. Por ejemplo,

“xn – nnx388a” es equivalente a “臺灣”. Ambos son TLD válidos, por cierto.

Para el código de conversión de punycode, consulte ” http://golang.org/src/pkg/net/http/cookiejar/punycode.go “.

Comprobar la syntax de cada componente del dominio también tiene nuevas reglas. Consulte RFC5890 en http://tools.ietf.org/html/rfc5890

Los componentes pueden ser tags A (solo ASCII) o Unicode. Las tags ASCII siguen la syntax antigua o comienzan con “xn--“, en cuyo caso son una versión punycode de una cadena Unicode.

Las reglas para Unicode son muy complejas y se dan en RFC5890. Las reglas están diseñadas para evitar cosas tales como mezclar caracteres de conjuntos de izquierda a derecha y de derecha a izquierda.

Lo siento, no hay una respuesta fácil.

(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(? 

Regex siempre será, en el mejor de los casos, una aproximación para cosas como esta, y las reglas cambian con el tiempo. La expresión regular anterior se escribió teniendo en cuenta lo siguiente y es específica de los nombres de host :

Los nombres de host se componen de una serie de tags concatenadas con puntos. Cada etiqueta tiene entre 1 y 63 caracteres, y puede contener:

  • las letras ASCII az (en una forma insensible a mayúsculas y minúsculas),
  • los dígitos 0-9,
  • y el guion ('-').

Adicionalmente:

  • las tags no pueden comenzar ni terminar con guiones (RFC 952)
  • las tags pueden comenzar con números (RFC 1123)
  • la longitud máxima del nombre del host ascii, incluidos los puntos, es de 253 caracteres (sin contar el punto final) ( http://blogs.msdn.com/b/oldnewthing/archive/2012/04/12/10292868.aspx )
  • los subrayados no están permitidos en los nombres de host (pero están permitidos en otros tipos de DNS)

algunas suposiciones:

  • TLD tiene al menos 2 caracteres y solo az
  • queremos al menos 1 nivel por encima del TLD

resultados: válido / inválido

  • 911.gov - válido
  • 911 - inválido (sin TLD)
  • a-.com - inválido
  • -a.com - inválido
  • a.com - válido
  • a.66 - inválido
  • my_host.com - inválido (undescore)
  • typical-hostname33.whatever.co.uk - válido

EDITAR: John Rix proporcionó un truco alternativo de la expresión regular para que la especificación de un TLD sea opcional:

 (?=^.{1,253}$)(^(((?!-)[a-zA-Z0-9-]{1,63}(? 
  • 911 - válido
  • 911.gov - válido

EDIT 2: alguien pidió una versión que funciona en js. la razón por la que no funciona en js es porque js no admite regex look behind. específicamente, el código (? - que especifica que el carácter anterior no puede ser un guión.

de todos modos, aquí está reescrito sin la mirada atrás, un poco más feo pero no demasiado

 (?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$) 

también podría hacer un reemplazo similar en la versión de John Rix.

EDIT 3: si desea permitir puntos finales, que técnicamente está permitido:

 (?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(? 

No estaba familiarizado con la syntax del punto final hasta que @ChaimKut los señaló y investigué

El uso de puntos finales, sin embargo, parece causar resultados algo impredecibles en las diversas herramientas con las que jugué, por lo que se recomienda cierta precaución.

Esta expresión regular es lo que quieres:

 (?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$) 

Coincide con el dominio de ejemplo (groupa-zone1appserver.example.com o cod.eu, etc.)

Trataré de explicar:

(?=^.{1,254}$) coincide con los nombres de dominio (que pueden comenzar con cualquier char) que tienen un largo entre 1 y 254 caracteres, también podría ser 5,254 si asumimos que co.uk es la longitud mínima.

(^ partida inicial

(?: definir un grupo coincidente

(?!\d+\.) el nombre de dominio no debe estar compuesto por números, por lo que 1234.co.uk o abc.123.uk no son aceptados, mientras que 1a.ko.uk sí.

[a-zA-Z0-9_\-] los nombres de dominio deben estar compuestos por palabras con solo a-zA-Z0-9_-

{1,63} la duración de cualquier nivel de dominio es máximo de 63 caracteres, (podría ser 2,63)

+ y

(?:[a-zA-Z]{2,})$) la parte final del nombre de dominio no debe ir seguida de ninguna otra palabra y debe estar compuesta por una palabra mínima de 2 caracteres a-zA-Z

CONSIDERACIÓN # 1:

Tenga en cuenta que debido a los requisitos relajados en RFC-2181, las tags DNS pueden consistir prácticamente en cualquier combinación de símbolos (sin embargo, las restricciones de longitud todavía están allí):

Cualquier cadena binaria cualquiera se puede usar como la etiqueta de cualquier registro de recursos. Las implementaciones de los protocolos DNS no deben imponer ninguna restricción a las tags que se pueden usar. En particular, los servidores DNS no deben negarse a servir una zona porque contiene tags eso podría no ser aceptable para algunos progtwigs cliente de DNS. “( https://tools.ietf.org/html/rfc2181#section-11 )

CONSIDERACIÓN # 2:

“Existe una regla adicional que básicamente requiere que los nombres de dominio de nivel superior no sean totalmente numéricos” ( https://tools.ietf.org/html/rfc3696#section-2 )

Teniendo en cuenta estas dos consideraciones, la expresión regular correcta se ve así:

/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i

Vea la demo @ http://regexr.com/3g5j0

La siguiente expresión

 (^((?=^.{4,253}$)(((http){0,1}|(http){0,1}|(ftp){0,1}|(ws){0,1})(s{0,1}):\/\/){0,1})((((?!-)[\pL0-9\-]{1,63})(? 

coincidirá

 https://www.tes1t.com/lets/to?878932572 https://www.test.co.uk/lets/to?878932572 http://www.test.com/lets/to?878932572 http://www.test.co.uk/lets/to?878932572 ftp://www.test.com/lets/to?878932572 subdomain.test.com/lets/to?878932572 subdomain.test.com/lets/to?878932572 subdomain.subdomain.test.net/lets/to?878932572 sub-domain.test.net/lets/to?878932572 sub-domain.test.net/lets-go/to?878932572 www.test.net/lets/to?878932572 www.test-test.com/ www.test-test.com subdomain.subdomainsubdomainsuèdomainsubdomainsubdomainsubdomainsubdomain.net/let2s/to?=878932572 www.test-test.co.uk http://www.test-test-.com/test www.test-teèst.co.uk/lets www.test-test.co.uk/lets/ www.test-test.co.uk/lets/to? test-test.co.uk/lets/to? test-test.co.uk/lets/ test-test.co.uk/lets test-test.co.uk http://test.com/lets/to?878932572 https://test.com/lets/to?878932572 ftp://test.com/lets/to?878932572 ftps://test.com/lets/to?878932572 ws://test.com/lets/to?878932572aa wss://test.com/lets/to?=878932572bar test.com subdomain.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.test.khbdomainsubdomainsubdomain.test.net/lets/to?87893257 

pero no coincide:

 www.-test-fail-.com www.-test-fail.com -test-fail.com test-fail-.com subdomain.subdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomainubdomainsubdomainsubdomain.test.net/lets/to?878932572 subdomain.subdomainsubdomainsubdcnvcnvcnofhfhghgfhvnhj-mainsubdomainsubdohhghghghfhgffgjh-gfhfdhfdghmainsubdocgvhngvnbnbmghghghaihgfjgfnfhfdghgsufghgghghhdfjgffsgfbdomainsubdomainsubdomainsubdomainsubdomainsubdomainsubdomain.test.net/lets/to?878932572 subdomain.test.test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test..test.khbdomainsubdomainsubdomain.test.net/lets/to?87893257