2008-10-03 25 views
9

je besoin d'un (php) regex pour correspondre aux règles de nom d'utilisateur Yahoo:Yahoo Nom d'utilisateur Regex

Utilisez 4 à 32 caractères et commencer par une lettre. Vous pouvez utiliser des lettres, des chiffres, des traits de soulignement et un point (.).

+1

Quel type de regex va le faire? Quel outil? À moins qu'il ne s'agisse d'un moteur PCRE (utilisé en Python et Ruby), divers outils ont différentes syntaxes regex. – Axeman

+1

php, comme je l'ai dit. bien que je puisse l'affiner à php 4.quelque chose – magicrobotmonkey

Répondre

16
/^[A-Za-z](?=[A-Za-z0-9_.]{3,31}$)[a-zA-Z0-9_]*\.?[a-zA-Z0-9_]*$/ 

Ou un peu plus court.

/^[a-z](?=[\w.]{3,31}$)\w*\.?\w*$/i 
+1

les tests initiaux semblent confirmer que celui-ci fonctionne. Je ne sais pas pourquoi ... – magicrobotmonkey

+0

ok après avoir lu à propos de lookarounds, je l'obtiens maintenant, c'est assez malade, merci – magicrobotmonkey

+1

ajouter '/ i' à la fin pour insensible à la casse. De cette façon, vous n'avez pas besoin de spécifier des minuscules et des majuscules. – CyberJunkie

2

Une limite d'un point? C'est difficile.

Je ne suis pas expert en regex, mais je pense que ce serait le faire, sauf que:

[A-Za-z][A-Za-z0-9_.]{3,31} 

Peut-être que vous pourriez vérifier la. exigence séparément?

+0

Celui-ci a besoin des ancres '^' et '$' pour imposer la longueur requise. – ridgerunner

+0

Comment changeriez-vous cela pour 1 seul trait de soulignement en gardant toutes les autres contraintes? – Joel

+1

@Joel de la même manière que je l'ai fait pour le point: l'appliquer séparément de l'expression. –

7
/[a-zA-Z][a-zA-Z0-9_]*\.?[a-zA-Z0-9_]*/ 

Et vérifier si strlen ($ username)> = 4 et < = 32.

+0

Maintenant, si nous pouvions trouver un moyen de combiner ces derniers, juste qu'il doit correspondre à la fois. –

+0

Ouais. strlen est une opération assez rapide, cependant. – Randy

+0

mais je n'ai pas la chance d'utiliser strlen, à l'endroit où je suis, une regex est tout ce que j'ai. – magicrobotmonkey

1

En utilisant lookaheads vous pouvez effectuer les opérations suivantes:

^(?=[A-Za-z](?:\w*(?:\.\w*)?$))(\S{4,32})$ 

Parce que vous ne spécifiez pas quel type de regex vous avez besoin j'ai ajouté beaucoup de choses compatible Perl 5. Comme (?: ...) pour les parens non-capturantes.

Note: J'ai ajouté les paren proches portés disparus retour dans

+0

Celui-ci manque une parenthèse de fermeture, et une fois que je l'ajoute (essayé quelques endroits ...) je ne peux pas l'obtenir pour assortir toutes les cordes que je jette à elle. – magicrobotmonkey