2009-09-13 17 views
28

Estoy buscando regex para validar nombres de host. Debe cumplir completamente con el estándar. En este momento, no tengoNombre de host Regex

^[0-9a-z]([0-9a-z\-]{0,61}[0-9a-z])?(\.[0-9a-z](0-9a-z\-]{0,61}[0-9a-z])?)*$

pero permite hypens sucesivas y nombres de host de más de 255 caracteres. Si la expresión regular perfecta es imposible, dígalo.

Edición/Aclaración: una búsqueda en Google no reveló que se trata de un problema resuelto (o comprobado insoluble). Quiero crear la expresión regular definitiva para que nadie tenga que escribir la suya propia. Si los dialectos importan, quiero una versión para cada uno en la que se pueda hacer esto.

Respuesta

27

^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$

+2

No acepta dominios con seguimiento "." pero de lo contrario, funciona. – nicerobot

+0

Solucionado. Me pregunto si la afirmación de longitud debería verificar si es 254 o menos excluyendo el punto final en lugar de solo verificar si es 255 o menos. De lo contrario, alguien a lo largo de la línea podría agregar el punto final a un nombre de host de longitud máxima y romperlo. – CannibalSmith

+1

La \ b antes del guión impide que coincida con nombres de dominio internacionalizados válidos, p. xn--bcher-kva.ch. –

1

Eche un vistazo a la siguiente pregunta. Algunas de las respuestas tienen expresiones de expresiones regulares para los nombres de host

Podría especificar el idioma que desea utilizar esta expresión regular en? La mayoría de los idiomas/sistemas tienen implementaciones de expresiones regulares ligeramente diferentes que afectarán las respuestas de las personas.

+1

estoy usando .NET, pero quiero que la expresión regular para ser tan portátil como sea posible para que otras personas pueden usarlo también – CannibalSmith

+0

Mientras mantenga su Regex, encontrará que su progreso obtenido se mantiene extremadamente portátil entre los entornos. – Hardryv

4

Tu respuesta ha estado relativamente cerca.

Pero ver

Para un RE nombre de host, que perl module produce

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]|[a-zA-Z])[.]?) 

I modificaría para ser más exactos como:

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]{0,61})?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]|[a-zA-Z])[.]?) 

Opcionalmente el anclaje de los extremos con ^$ para SOLAMENTE ma tch nombres de host.

No creo que una sola RE pueda realizar una validación completa porque, de acuerdo con Wikipedia, hay una restricción de 255 caracteres de longitud que no creo que pueda incluirse dentro de la misma RE, al menos no sin una tonelada de cambios, pero es fácil simplemente verificar la longitud < = 255 antes de ejecutar el RE.

0

¿Qué hay de:

^(?=.{1,255})([0-9A-Za-z]|_{1}|\*{1}$)(?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*\.?$ 

para hacer coincidir sólo un '_' (por alguna SRV) al principio y sólo uno * (en el caso de una etiqueta para un comodín DNS)

7

La respuesta aprobada valida nombres de host no válidos que contienen varios puntos (ejemplo..com). Aquí hay una expresión regular que se me ocurrió que creo que coincide exactamente con lo que está permitido bajo los requisitos de RFC (menos una terminación "."Apoyada por algunos resolutores a cortocircuitos nombrado relativo y la fuerza de resolución FQDN)

de especificaciones:.

<hname> ::= <name>*["."<name>] 
<name> ::= <letter-or-digit>[*[<letter-or-digit-or-hyphen>]<letter-or-digit>] 

Regex:

^([a-zA-Z0-9](?:(?:[a-zA-Z0-9-]*|(?<!-)\.(?![-.]))*[a-zA-Z0-9]+)?)$ 

He probado bastantes permutaciones mí mismo, creo que es preciso.

Esta expresión regular tampoco valida el largo. Las restricciones de longitud en las etiquetas entre puntos y en los nombres son requeridas por RFC, pero las longitudes pueden ser fácilmente aparecieron como pases segundo y tercero después de validar contra esta expresión regular, verificando la longitud total de la cadena y dividiendo en "." y validando todas las longitudes de las subcadenas. Por ejemplo, en JavaScript, la validación de la longitud de la etiqueta podría ser similar a: "example.com".split(".").reduce(function (prev, curr) { return prev && curr.length <= 63; }, true).


Alternativa expresión regular (sin negativos de búsqueda hacia atrás, cortesía @thom_nic):

^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)+(\.([a-zA-Z0-9]+(-[a-zA-Z0-9‌​]+)*))*$

+1

que no podía usar una búsqueda hacia atrás negativo (gracias JS) por lo que ocurrió con esta que es muy similar: '^ ([a-zA -Z0-9] + (- [a-zA-Z0-9] +) *) + (\. ([A-zA-Z0-9] + (- [a-zA-Z0-9] +) *)) * $ '- de nuevo no comprueba la longitud, pero * valida * sin encabezar/arrastrar/repetir' -' o '.'. Funciona en nombres de host desnudos o FQDN. –

Cuestiones relacionadas