Je tente de valider une chaîne d'entrée utilisateur qui sera utilisée comme sous-domaine. Les règles sont les suivantes:
Edit: à partir de l'entrée ci-dessous, j'ai ajouté ce qui suit: 4. Ne doit pas contenir des traits d'union ou des soulignements consécutifs. P>
Exemples: P>
a => valid 0 => valid - => not valid _ => not valid a- => not valid -a => not valid a_ => not valid _a => not valid aa => valid aaa => valid a-a-a => valid 0-a => valid a&a => not valid a-_0 => not valid a--a => not valid aaa- => not valid
5 Réponses :
EDIT: En réalité, cela ne vérifie pas les lettres / chiffres simples / doubles. essayez / [^ \ w \ _] (. +?) [^ \ w \ _ \ _] $ / i code> devrait fonctionner pour ya (essayez notre http://rubular.com/ pour tester des expressions régulières) p>
/ ([^ \ w \ _] (. +?) [^ \ w \ _ _]) | ([A-Z0-9] {1,2}) / i code> à la place, et Tinker avec elle dans une rubrique jusqu'à ce que vous obteniez exactement ce que vous voulez (si cela ne s'en occupe pas déjà de cela). P>
Merci, j'utilise Rubular et c'est un excellent outil de test. Je pense que l'expression que vous avez donnée a le même problème de ne pas autoriser des chaînes inférieures à 3 caractères que j'ai eues. Il semble également que des caractères autres que des traits d'union et de soulignement au milieu (A & A apparaissent valables). Je me demande également si vous avez quitté le ^ hors de tout début, et si oui pour quelle raison.
Cela correspond à .nnngygyg (ng966% et i. Code>, et correspondrait à beaucoup d'autres merde aussi. Vous devez lire surgèrent. Les sections PCRE de manuels PHP sont très utiles.
Merci @LUCAS, j'ai oublié d'inclure zéro de caractères de correspondance dans le match de répétition. Ignorer ma suggestion :)
/^([a-z0-9]([_\-](?![_\-])|[a-z0-9]){0,61}[a-z0-9]|[a-z0-9])$/i
L'original devrait fonctionner pour des entrées de 2 lettres également (c'est pourquoi il y a le {0,61} code>. Le point d'interrogation peut également être omis, je vais le modifier.
Cela correspondra au a ___ --- _____ - __ - __-__ ----- __ --- __ tout ce qui est à la fin code> et
tout ce qui est au début ^ & * ^ & ^) ^) _ --- _-- ABC code>. Si vous insistez pour permettre aux sous-domaines affreux remplis de
- code> et
_ code> alors vous devez mettre des parenthèses sur le ou:
/ ^ ([A-ZA-Z0-9 ] [A-ZA-Z0-9 \ - \ _] {0,61}? [A-ZA-Z0-9] | [A-ZA-Z0-9]) $ / Code>
@Justin 0-9 code> dans une classe de caractères permet des chiffres.
@LUCAS: Je l'ai modifiée à plusieurs reprises, mieux de recharger ainsi avant de commenter :) @Justin: corrigé.
@Jakub merci de modifier pour les chiffres. Cela fait ce que je cherchais mais je suis aussi d'accord avec les contributions de @ Lucas sur ne pas autoriser des traits d'union et des soulignements consécutifs. Ses œuvres super aussi.
@gsr j'ai eu un défi et a fait une regex intéressante;)
vous avec ce qui précède, vous n'obtiendrez pas consécutif ne peut pas del> peut avoir des soulignements dans appropriés del> sous-domaines, mais avez-vous besoin d'eux? Après Coupez CODE> MING Votre entrée, effectuez une vérification de longueur de chaîne simple, puis testez-le avec ceci:
- code> caractères, par exemple
a-bbb-ccc code> passe et
a - d code> échoue. p>
/\A([a-z][a-z\d]*(-[a-z\d]+)*|xn--[\-a-z\d]+)\z/i
Après avoir réfléchi à cela, je suis d'accord que permettant aux traits d'union et de soulignement consécutifs ferait des sous-domaines très laids. Apprécier l'entrée. Cela fonctionne bien.
Je pensais à des domaines qui sont plus restrictifs, mais je ne me soucierais pas de laisser des séparateurs consécutifs comme votre réponse sélectionnée, ils vont avoir l'air laid et ne pas ajouter à la convivialité / à la lecture.
Cette regex est ce dont j'ai besoin, mais comment forcer la longueur de charme min pour la chaîne complète. Essayé différents paramètres avec {n,} à différents endroits, Bu rien n'a travaillé.
@webdeb Comme indiqué dans ma réponse, faites-le avant la regex, c'est-à-dire vérifier la propriété code> de la chaîne.
"111111" = ~ / \ a [A-Z \ D] + ([-_] [A-Z \ D] +) * $ \ z / code> Cela ne doit pas correspondre, mais correspondant
@Sohairahmad non, ça devrait; Le modèle est correct selon la spécification de OP. J'ai ajouté une mise à jour à ma réponse, cependant. Vous devez Pratiquez votre refrégement .
@Sohairahmad non, il vient de rencontrer la spécification de OP.
@Walf n'est pas sûr si je reçois la différence entre le nom de domaine valide et la spécification de OP, mais merci.
@Sohairahmad op a écrit 0 => valide code> et
0-a => valide code>.
Je ne connais pas la syntaxe de Ruby Regex, mais je suppose que c'est comme si, disons, Perl. On dirait que vous voulez: ou si ruby n'utilise pas le drapeau La raison pour laquelle j'utilise Quelques informations supplémentaires sur classes de caractères , Quantificateurs et < un href = "http://www.regular-expressions.info/lookaround.html" rel = "nofollow"> cherche surounds p> p> i code>, il suffit de remplacer
[- AZ \ d _] code> avec
[- a-za-z \ d _] code>. p>
[- A-ZA-Z \ D _] code> au lieu de le plus court
[- \ w] code> est-ce, tandis que presque équivalent,
\ w code> permettra des caractères spéciaux tels que ¤ fort> plutôt que juste Tapez les caractères. Ce comportement peut être éventuellement désactivé dans la plupart des langues, ou vous pouvez le laisser si vous le souhaitez. P>
^ [A-ZA-Z] ([- A-ZA-Z \ D] * [A-ZA-Z \ D])? $ p>
Cela applique simplement la norme de manière efficace sans retour en arrière. Il ne vérifie pas la longueur, mais le regex est inefficace dans des choses comme ça. Vérifiez simplement la longueur de la chaîne (1 à 64 caractères). P>
Merci, la rubrique liée comprend une vérification de la validité de domaine complet, et je ne cherche que une chaîne valide pour une utilisation en tant que sous-domaine. Avez-vous des conseils sur la façon de la modifier pour fonctionner? Je n'arrive pas à faire les changements nécessaires.