10
votes

Expression régulière pour le sous-domaine valide en rubis

Je tente de valider une chaîne d'entrée utilisateur qui sera utilisée comme sous-domaine. Les règles sont les suivantes:

  1. entre 1 et 63 caractères (je prends 63 du nombre de caractères Google Chrome semble autoriser dans un sous-domaine, je ne sais pas si c'est en fait une directive serveur. Si vous avez de meilleurs conseils sur une longueur maximale valide, je suis intéressé à l'entendre) li>
  2. peut contenir A-ZA-Z0-9, un trait d'union, un trait de soulignement li>
  3. peut ne pas commencer ou se terminer par un trait d'union ou un trait de soulignement li> OL>

    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 :


-1
votes

/ [^ \ w \ _] (. +?) [^ \ w \ _ \ _] $ / i devrait fonctionner pour ya (essayez notre http://rubular.com/ pour tester des expressions régulières)

EDIT: En réalité, cela ne vérifie pas les lettres / chiffres simples / doubles. essayez / ([^ \ w \ _] (. +?) [^ \ w \ _ _]) | ([A-Z0-9] {1,2}) / i à 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).


3 commentaires

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. , 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 :)



0
votes
/^([a-z0-9]([_\-](?![_\-])|[a-z0-9]){0,61}[a-z0-9]|[a-z0-9])$/i

6 commentaires

L'original devrait fonctionner pour des entrées de 2 lettres également (c'est pourquoi il y a le {0,61} . Le point d'interrogation peut également être omis, je vais le modifier.


Cela correspondra au a ___ --- _____ - __ - __-__ ----- __ --- __ tout ce qui est à la fin et tout ce qui est au début ^ & * ^ & ^) ^) _ --- _-- ABC . Si vous insistez pour permettre aux sous-domaines affreux remplis de - et _ 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]) $ /


@Justin 0-9 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;)



19
votes

vous 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: xxx pré>

avec ce qui précède, vous n'obtiendrez pas consécutif - 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


9 commentaires

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é de la chaîne.


"111111" = ~ / \ a [A-Z \ D] + ([-_] [A-Z \ D] +) * $ \ z / 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 et 0-a => valide .



0
votes

Je ne connais pas la syntaxe de Ruby Regex, mais je suppose que c'est comme si, disons, Perl. On dirait que vous voulez: xxx

ou si ruby ​​n'utilise pas le drapeau i , il suffit de remplacer [- AZ \ d _] avec [- a-za-z \ d _] .

La raison pour laquelle j'utilise [- A-ZA-Z \ D _] au lieu de le plus court [- \ w] est-ce, tandis que presque équivalent, \ w permettra des caractères spéciaux tels que ¤ 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.

Quelques informations supplémentaires sur classes de caractères , Quantificateurs et < un href = "http://www.regular-expressions.info/lookaround.html" rel = "nofollow"> cherche surounds


0 commentaires

0
votes

^ [A-ZA-Z] ([- A-ZA-Z \ D] * [A-ZA-Z \ D])? $

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


0 commentaires