2009-09-13 13 views
28

Je recherche le regex pour valider les noms d'hôtes. Il doit être entièrement conforme à la norme. En ce moment, jeLe nom d'hôte Regex

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

mais permet hypens successifs et hostnames plus de 255 caractères. Si la regex parfaite est impossible, dites-le. Editer/Clarification: une recherche Google n'a pas révélé qu'il s'agit d'un problème résolu (ou prouvé insoluble). Je veux créer la regex définitive pour que personne n'ait à écrire la sienne. Si les dialectes importent, je veux une version pour chacun dans laquelle cela puisse être fait.

Répondre

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

Il n'accepte pas les domaines avec "." mais sinon, ça marche. – nicerobot

+0

Fixé. Je me demande si l'assertion de longueur devrait vérifier si elle est 254 ou moins en excluant le point de fin au lieu de simplement vérifier si elle est de 255 ou moins. Sinon, quelqu'un le long de la ligne pourrait ajouter le point final à un nom d'hôte de longueur maximale et le casser. – CannibalSmith

+1

Le \ b avant le trait d'union empêche cela de faire correspondre des noms de domaine internationalisés valides, par ex. xn--bcher-kva.ch. –

1

Jetez un oeil à la question suivante. Quelques-unes des réponses ont des expressions regex pour les noms d'hôte

Pouvez-vous préciser quelle langue vous souhaitez utiliser cette regex dans? La plupart des langages/systèmes ont des implémentations de regex légèrement différentes qui affecteront les réponses des utilisateurs.

+1

J'utilise .NET, mais je veux le regex soit aussi portable que possible afin que d'autres personnes peuvent l'utiliser aussi. – CannibalSmith

+0

Tant que vous maintenez votre Regex, vous constaterez que votre progression méritée reste extrêmement portable entre les environnements. – Hardryv

4

Votre réponse était relativement proche.

Mais voir

Pour un nom d'hôte RE, que perl module produit

(?:(?:(?:(?:[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])[.]?) 

Je modifierais pour être plus précis que:

(?:(?:(?:(?:[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])[.]?) 

ancrage En option, les extrémités avec ^$ à seulement ma tch hostnames.

Je ne pense pas qu'un seul RE peut accomplir une validation complète car, selon Wikipedia, il y a une restriction de longueur de 255 caractères que je ne pense pas pouvoir inclure dans cette même ER, du moins pas sans une tonne des changements, mais il est assez facile de simplement vérifier la longueur < = 255 avant d'exécuter le RE.

0

Qu'en est-:

^(?=.{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])?)*\.?$ 

pour faire correspondre un seul '_' (pour certains SRV) au début et un seul * (en cas d'une étiquette pour un caractère générique DNs)

7

La réponse approuvée valide les noms d'hôte incorrects contenant plusieurs points (exemple..com). Voici une regex que j'ai trouvé qui correspond exactement à ce qui est permis en vertu des exigences du RFC (moins une fin)."Soutenu par certains résolveurs à nommer relativement court-circuit et la force résolution FQDN)

Spec.

<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]+)?)$ 

Je l'ai testé pas mal de permutations moi-même, je pense que c'est exact

Cette regex ne fait pas non plus de validation de longueur Les contraintes de longueur sur les étiquettes entre les points et sur les noms sont requises par RFC, mais les longueurs peuvent facilement être ch Cochez comme second et troisième passages après validation par rapport à cette regex, en vérifiant la longueur totale de la chaîne, et en séparant "." et en validant toutes les longueurs de sous-chaînes. Par exemple, en JavaScript, la validation de longueur d'étiquette peut ressembler à: "example.com".split(".").reduce(function (prev, curr) { return prev && curr.length <= 63; }, true).


Alternative Regex (sans lookbehind négative, avec la permission @thom_nic):

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

+1

Je ne pouvais pas utiliser un lookbehind négatif (merci JS) donc je suis arrivé avec ce qui est très similaire: '^ ([a-zA -Z0-9] + (- [a-zA-Z0-9] +) *) + (\. ([A-zA-Z0-9] + (- [a-zA-Z0-9] +) *)) * $ '- encore une fois il ne vérifie pas la longueur mais il * ne * valide pas de début/fin/répétition' -' ou '.'. Fonctionne sur les noms d'hôtes nus ou les noms de domaine complets. –

Questions connexes