390 votes

Expression régulière pour faire correspondre le nom d'hôte DNS ou l'adresse IP ?

Quelqu'un a-t-il sous la main une expression régulière qui correspond à n'importe quel nom d'hôte ou adresse IP DNS légal ?

Il est facile d'en écrire un qui fonctionne 95 % du temps, mais j'espère obtenir quelque chose de bien testé qui corresponde exactement aux dernières spécifications RFC pour les noms d'hôtes DNS.

0 votes

Attention : Il est possible de savoir si une chaîne de caractères est une adresse IPv4 valide et de savoir s'il s'agit d'un nom d'hôte valide. Mais : Il n'est pas possible de savoir si une chaîne de caractères est une adresse IPv4 valide ou un nom d'hôte valide. La raison : Toute chaîne qui correspond à une adresse IPv4 valide est également un nom d'hôte valide qui peut être résolu en une adresse IP différente par le serveur DNS.

563voto

smink Points 39640

Vous pouvez utiliser les expressions régulières suivantes séparément ou en les combinant dans une expression OR commune.

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 correspond à des adresses IP valides et ValidHostnameRegex noms d'hôtes valides. Selon la langue que vous utilisez, il peut être nécessaire d'échapper à l'aide de la commande \.


ValidHostnameRegex est valable selon RFC 1123 . A l'origine, RFC 952 spécifiait que les segments de noms d'hôtes ne pouvaient pas commencer par un chiffre.

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

La spécification originale de noms d'hôtes dans RFC 952 , a exigé que les étiquettes ne puissent pas commencer par un chiffre ou un trait d'union, et ne doivent pas se terminer par un trait d'union. Cependant, une spécification ultérieure ( RFC 1123 ) permet aux étiquettes de noms d'hôtes de commencer avec des chiffres.

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])$";

0 votes

Votre regex pour le nom d'hôte est plutôt bon et semble correspondre à tout. Vous devriez modifier votre réponse pour qu'elle n'ait pas le double échappement pour les points et les traits d'union, et le sz qui la fait ressembler à un langage Microsoft.

3 votes

Ici : stackoverflow.com/questions/4645126/ - J'explique que les noms qui commencent par un chiffre sont également considérés comme valides. De même, le fait qu'il n'y ait qu'un seul point est un problème discutable. Il serait bon d'avoir plus de commentaires à ce sujet.

17 votes

Vous pourriez vouloir ajouter IPv6. L'OP n'a pas spécifié quel type d'adresse. (D'ailleurs, on peut le trouver aquí )

69voto

Le nom d'hôte de la regex de smink ne respecte pas la limitation sur la longueur des étiquettes à l'intérieur d'un nom d'hôte. Chaque étiquette à l'intérieur d'un nom d'hôte valide peut-être plus de 63 octets de long.

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]))*$"

Notez que la barre oblique à la fin de la première ligne (ci-dessus) est shell Unix syntaxe pour fendre le long de la ligne. Ce n'est pas une partie de l'expression régulière.

Voici juste l'expression régulière, seul, sur une seule ligne:

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

Vous devriez également vérifier séparément que la longueur totale du nom d'hôte ne doit pas dépasser 255 caractères. Pour plus d'informations, veuillez consulter la RFC 952 et RFC 1123.

7 votes

Excellent modèle d'hôte. Cela dépend probablement de l'implémentation du regex dans le langage, mais pour JS, il peut être légèrement ajusté pour être plus court sans rien perdre : /^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?(\.[a-z\d]([a-z\d\-]{0,61}‌​[a-z\d])?)*$/i

0 votes

C'est ce que je veux, mais le symbole "@" ne doit permettre que ce caractère spécial pour le nom d'hôte Root ? Je suis nouveau dans le domaine des DNS et des expressions rationnelles.

33voto

Alban Points 568

pour correspondre à une utilisation d’adresse IP valide

Au lieu de

parce que nombreux moteur d’expression régulière correspond à la première possibilité dans la séquence de l’OR

vous pouvez essayer votre moteur d’expression régulière : 10.48.0.200

tester la différence ici vs mauvais

5 votes

N'oubliez pas le début ^ et la fin $ ou quelque chose comme 0.0.0.999 ou 999.0.0.0. ;)

1 votes

Oui pour valider une chaîne de caractères le début ^ et la fin $ sont nécessaires, mais si vous recherchez une IP dans un texte ne l'utilisez pas.

0 votes

La "non-gratuité" involontaire que vous identifiez s'applique également aux autres solutions de noms d'hôtes. Il serait bon de l'ajouter à votre réponse, car les autres solutions ne correspondent pas au nom d'hôte complet, par exemple ([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]))* contre ([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]‌​)|[a-zA-Z0-9]))*

6voto

Alex Volkov Points 306

Je ne semble pas être en mesure de modifier le poste le plus élevé, donc je vais ajouter ma réponse ici.

Pour le nom d'hôte - la réponse est facile, sur egrep exemple ici -- http: //www.linuxinsight.com/how_to_grep_for_ip_addresses_using_the_gnu_egrep_utility.html

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

Bien que le cas ne tient pas compte des valeurs de 0 dans le premier octet, et les valeurs supérieures à 254 (adresse ip) ou 255 (masque de réseau). Peut-être un supplémentaire si l'instruction de l'aide.

Concernant les dns du nom d'hôte, à condition que vous vérifiez pour des noms d'hôtes internet uniquement (et non intranet), j'ai écrit ce ciselée, un mélange de shell/php, mais il devrait être applicable à toute expression régulière.

d'abord aller à l'ietf site web, de télécharger et d'analyser une liste de juridique de niveau 1, les noms de domaine:

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)"

Cela devrait vous donner une belle pièce de re code qui vérifie la légalité du haut nom de domaine, tel .com .org ou .ca

Ajoutez ensuite la première partie de l'expression selon les lignes directrices se trouvent ici -- http: //www.domainit.com/support/faq.mhtml?category=Domain_FAQ&question=9 (toute combinaison alphanumérique et le symbole' -', le tableau de bord ne doit pas être dans le début ou la fin d'un octet.

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

Puis mettre le tout ensemble (PHP preg_match exemple):

$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
    }

Vous pouvez également ajouter une instruction if pour vérifier que la chaîne qui vous intéresse est inférieure à 256 caractères -- http://www.ops.ietf.org/lists/namedroppers/namedroppers.2003/msg00964.html

1 votes

-1 car cela correspond à des adresses IP bidons comme "999.999.999.999".

1 votes

"Bien que l'affaire ne tienne pas compte de valeurs comme 0 dans le premier octet, et de valeurs supérieures à 254 (adresses IP) ou 255 (masque de réseau)."

0 votes

J'ai vu que vous avez nuancé votre réponse, oui. J'ai rétrogradé parce que cette partie de ta réponse n'est toujours pas utile.

1voto

P Thapa Points 189

Je pense que c'est la meilleure regex de validation d'Ip. Veuillez la vérifier une fois !

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X