2010-03-13 4 views
3

J'ai un formulaire où l'utilisateur soumet un champ. Le champ peut contenir des lettres, des chiffres et des signes de ponctuation. Mais je veux vérifier pour qu'au moins 3 des caractères soient des lettres. Comment puis-je regex cela?Comment dire à regex de correspondre à au moins x nombre de caractères alphanumériques?

Par exemple,

$string = "ab'c"; 

Et je besoin de quelque chose comme,

if (preg_match("/[a-z]{3}/i", $string)) 
    print "true"; 
else 
    print "false"; 

Cette chaîne a trois lettres, même si elle a une apostrophe. Cela devrait être vrai. Mais pour une raison quelconque, cela teste faux maintenant.

Une aide?

Répondre

3

Que diriez-vous d'un match de cas insensible sur:

([a-z][^a-z]*){3} 

Attend pour 3 groupes d'une lettre et un certain nombre de lettres non.

+0

Je pense que nous avons un gagnant! : D Merci beaucoup. – codemonkey613

+0

Peut-être légèrement plus efficace pour rendre le '*' non-gourmand ... * haussements d'épaules *. –

+0

Si la performance importait, un quantificateur non-gourmand ferait probablement penser pire, pas mieux. Un * possessif * serait certainement plus efficace - '([a-z] [^ a-z] * +) {3}' - mais nous parlons de valider les entrées des utilisateurs, donc la performance n'est pas une préoccupation légitime. –

0

Essayez ceci: Le $ correspond à la fin de la chaîne;)

if (preg_match("/[a-zA-Z\']{3}$/i", $string)) 
    print "true"; 
else 
    print "false"; 

Edit: Désolé, j'ai mal compris votre question. Essayez ceci:
^([a-zA-Z\']{3,}(.?))$

Résultats:
hell'o < - vrai
h31l0 < - faux
hello < - true

+0

Je veux que le test soit vrai s'il y a au moins 3 lettres. Donc, tous ces cas de hell0 je voudrais tester vrai. – codemonkey613

+0

? Tout ce que vous avez fait est sustitute à la fois supérieur et inférieur pour l'original inférieur (qui je suis assez sûr est déjà géré par le "/ i" de toute façon). En tout cas, "hell'o" et "" hell0 "_satisfait_ les conditions – paxdiablo

+0

@paxdiablo: Non, j'ai ajouté le signe $ pour correspondre à la fin de la chaîne @codemonkey: Oh, je pense que j'ai mal compris votre question, je pensais que vous vouliez faire correspondre 3 caractères alphanumériques à la fin de la chaîne ... Désolé pour cela – Daan

1

Vous ne pouvez pas écrire un regexp qui vérifie « au moins x symboles d'une classe ". Bien sûr, vous pouvez

preg_match_all('~([a-z][^a-z]*){3}~', "ab'c") 

Dans les cas plus complexes, vous pouvez remplacer la classe à quelque chose d'autre, puis de comparer les résultats (ou simplement utiliser preg_replace quatrième paramètre):

preg_replace('~[a-z]~', '', "ab'c", -1, $count); 
print_r($count); // prints "3" 
+0

Err, oui vous pouvez :-) – paxdiablo

+0

Oui, j'ai pensé à cela il ya une seconde.Je peux enlever tout sauf les lettres, puis vérifier la longueur de la chaîne pour voir si elle est supérieure à 3. Merci. – codemonkey613

1

Essayez cette expression régulière:

^([0-9,]*[A-Za-z]){3}[A-Za-z0-9,]*$ 

Vous pouvez également supprimer tous les caractères non-lettre et vérifier la longueur:

if (strlen(preg_replace('/[^A-Za-z]+/', '', $str)) >= 3) { 
    // $str contains at least three letters 
} 
+0

Oui, ça marche aussi. Merci! – codemonkey613

Questions connexes