2010-06-08 6 views
5

Je veux une expression régulière qui permet seulement ceci:Une expression régulière rapide nécessaire

letter a-z 
case insensitive 
allows underscores 
allows any nrs 

Comment devrait-il être écrit?

Merci

+0

Rien ... Je ne sais pas grand-chose sur l'expression rationnelle –

+0

Quelle langue? Tous ceux dans vos tags? –

+0

php, désolé les gars ... –

Répondre

7

Ce serait

 
\w 

si je ne me trompe pas (Comme il se trouve, il dépend: En PHP les meaning of \w changements avec le locale qui est actuellement en vigueur). Vous pouvez utiliser a more explicit form pour le clouer:

 
[A-Za-z0-9_] 

Je l'utilise dans son contexte, ajouter de début de chaîne et de fin de chaîne anchors et un quantifier qui définit combien de caractères vous permettra:

 
^[A-Za-z0-9_]+$ 
0
if(preg_match('/^[0-9a-z_]+$/i', $string)) { 
    //if it matches 
} 

else { 
    //if it doesn't match 
} 

[0-9a-z_] est une classe de caractères qui définit les chiffres de 0 à 9, les lettres a à z et le trait de soulignement. Le i à la fin rend la correspondance insensible à la casse. ^ et $ sont des ancres qui correspondent respectivement au début et à la fin de la chaîne. Le + signifie 1 ou plusieurs caractères.

+2

Mauvais. Cela renverra un faux positif si l'entrée contient un caractère valide - même si elle contient également des caractères non valides. – Matt

+0

Bon point - Je suis en train d'éditer ma réponse. –

+0

Cela ne fonctionnerait pas. "a b c d" passerait, car vous recherchez uniquement l'un des caractères de la chaîne à faire correspondre. Modifiez le motif en '/^[0-9a-z _] $/i' et ça marchera. – ceejayoz

5

PHP:

if (preg_match('/[^a-z0-9_]/i', $input)) { 
    // invalid input 
} else { 
    // valid input 
} 

Alors [a-z0-9_] est un jeu de caractères pour vos caractères valides. L'ajout d'un ^ à l'avant ([^a-z0-9_]) l'annule. La logique est, si un caractère correspond à quelque chose qui n'est pas dans le jeu de caractères valide, l'entrée est considérée comme invalide.

Le /i à la fin rend la casse insensible à la casse.

+0

+1 - L'expression rationnelle à tester/lire est parfois la négation. Plutôt que d'autoriser seulement certains caractères, il suffit de tester l'existence d'un caractère invalide. – gnarf

+0

Mais quand le motif est le même (négation de barre), il suffit d'inverser les blocs if/else, ou de mettre un '!' Avant 'preg_match'. Négocier rend la tâche plus facile lorsque vous modifiez le problème, et non lorsque vous écrivez le même motif de façon légèrement différente. –

1

Comment devrait-il être écrit? (Découpant en plusieurs lignes)

/   # Start RegExp Pattern 
^   # Match beginning of string only 
[a-z0-9_]* # Match characters in the set [ a-z, 0-9 and _ ] * = Zero or more times 
$   # Match end of string 
/i   # End Pattern - Case Insensitive Matching 

vous donnant

if (preg_match('/^[a-z0-9_]*$/i', $input)) { 
    // input is valid 
} 

Vous pouvez également utiliser un + au lieu de * si vous voulez forcer au moins un caractère aussi bien.

+1

N'est-ce pas sensible à la casse? Votre code qui est (pas l'explication!) –

+0

@Vivin Paliath - Yup! Merci pour le petit coup de coude. – gnarf

+0

C'est bon, pas de problème! :) –

Questions connexes