¿Expresión regular para que coincida con el nombre de host DNS o la dirección IP?

Resuelto DonGar asked hace 15 años • 23 respuestas

¿Alguien tiene a mano una expresión regular que coincida con cualquier nombre de host DNS o dirección IP legal?

Es fácil escribir uno que funcione el 95% de las veces, pero espero obtener algo que esté bien probado y que coincida exactamente con las últimas especificaciones RFC para nombres de host DNS.

DonGar avatar Sep 20 '08 05:09 DonGar
Aceptado

Puede utilizar las siguientes expresiones regulares por separado o combinándolas en una expresión OR conjunta.

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";

ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$";

ValidIpAddressRegex coincide con direcciones IP válidas y nombres de host válidos ValidHostnameRegex . Dependiendo del idioma que utilices, es posible que tengas que usar \ como escape.


ValidHostnameRegex es válido según RFC 1123 . Originalmente, RFC 952 especificaba que los segmentos de nombres de host no podían comenzar con un dígito.

http://en.wikipedia.org/wiki/Hostname

La especificación original de nombres de host en RFC 952 exigía que las etiquetas no pudieran comenzar con un dígito o con un guión, y no debían terminar con un guión. Sin embargo, una especificación posterior ( RFC 1123 ) permitió que las etiquetas de nombre de host comenzaran con dígitos.

Valid952HostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$";
Jorge Ferreira avatar Sep 19 '2008 22:09 Jorge Ferreira

La expresión regular del nombre de host de smink no respeta la limitación de la longitud de las etiquetas individuales dentro de un nombre de host. Cada etiqueta dentro de un nombre de host válido no puede tener más de 63 octetos.

ValidHostnameRegex="^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]) \
(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])) ps

Tenga en cuenta que la barra invertida al final de la primera línea (arriba) es la sintaxis del shell Unix para dividir la línea larga. No es parte de la expresión regular en sí.

Aquí está solo la expresión regular en una sola línea:

^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\. ([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$

También debe comprobar por separado que la longitud total del nombre de host no debe exceder los 255 caracteres . Para obtener más información, consulte RFC-952 y RFC-1123.

Sakari A. Maaranen avatar Sep 29 '2010 17:09 Sakari A. Maaranen

Para hacer coincidir una dirección IP válida , utilice la siguiente expresión regular:

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}

en lugar de:

([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3}

Explicación

Muchos motores de expresiones regulares coinciden con la primera posibilidad de la ORsecuencia. Por ejemplo, pruebe la siguiente expresión regular:

10.48.0.200

Prueba

Prueba la diferencia entre el bien y el mal

Alban avatar Jan 22 '2013 07:01 Alban

Parece que no puedo editar la publicación principal, así que agregaré mi respuesta aquí.

Para el nombre de host: respuesta fácil, en el ejemplo de egrep aquí: http: //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html

egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

Aunque el caso no tiene en cuenta valores como 0 en el primer octeto y valores superiores a 254 (dirección IP) o 255 (máscara de red). Quizás una declaración if adicional ayudaría.

En cuanto al nombre de host dns legal, siempre que esté buscando nombres de host de Internet únicamente (y no de intranet), escribí lo siguiente recortado, una combinación de shell/php, pero debería ser aplicable como cualquier expresión regular.

Primero vaya al sitio web del ietf, descargue y analice una lista de nombres de dominio legales de nivel 1:

tld=$(curl -s http://data.iana.org/TLD/tlds-alpha-by-domain.txt |  sed 1d  | cut -f1 -d'-' | tr '\n' '|' | sed 's/\(.*\)./\1/')
echo "($tld)"

Eso debería brindarle un buen código que verifica la legalidad del nombre de dominio principal, como .com, .org o .ca.

Luego agregue la primera parte de la expresión de acuerdo con las pautas que se encuentran aquí: http: //www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 (cualquier combinación alfanumérica y el símbolo '-', el guión no debe estar en el principio o el final de un octeto.

(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+

Luego, júntelo todo (ejemplo de PHP preg_match):

$pattern = '/^(([a-z0-9]+|([a-z0-9]+[-]+[a-z0-9]+))[.])+(AC|AD|AE|AERO|AF|AG|AI|AL|AM|AN|AO|AQ|AR|ARPA|AS|ASIA|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BIZ|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CAT|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|COM|COOP|CR|CU|CV|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EDU|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GOV|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|INFO|INT|IO|IQ|IR|IS|IT|JE|JM|JO|JOBS|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MIL|MK|ML|MM|MN|MO|MOBI|MP|MQ|MR|MS|MT|MU|MUSEUM|MV|MW|MX|MY|MZ|NA|NAME|NC|NE|NET|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|ORG|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PRO|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SY|SZ|TC|TD|TEL|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TP|TR|TRAVEL|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|XN|YE|YT|YU|ZA|ZM|ZW)[.]?$/i';

    if (preg_match, $pattern, $matching_string){
    ... do stuff
    }

También es posible que desee agregar una declaración if para verificar que la cadena que está verificando tenga menos de 256 caracteres: http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html

Alex Volkov avatar Mar 03 '2010 21:03 Alex Volkov