Contrôler un mot par expression régulière

WRInaute passionné
Bonjour,

Je ne parviens pas à contrôler la validité d'un mot transmit par $_GET pouvant contenir uniquement des lettres minuscules avec ou sans tiret :
Code:
if(!ereg("^[a-z-]$", $_GET['b']))
 {
   echo 'erreur';
 }

Visiblement mon code est faux ..

Merci
 
WRInaute passionné
Je n'ai pas d'erreur particulière mais si dans mon url (donc dans $_GET['b']) je remplace le nom d'un dossier virtuel (ex :/voiture/) par (ex :/voi9ure/), je n'ai pas mon message d'erreur qui s'affiche.
 
WRInaute discret
Ton code me semble avoir différents problèmes :
- la fonction ereg est obsolète, il faut la remplacer par preg_match
- effectivement si tu ne rajoutes pas un * , il faudrait que ta chaîne fasse un seul caractère pour ne pas générer d'erreur.
- Je pense qu'il faut ajouter un caractère comme # en début et en fin de pattern

Un code qui semble bon :
Code:
if(!preg_match("#^[a-z-]*$#", $st))
{
   echo 'erreur';
}

Si st vaut voiture, pas d'erreur.
Si st vaut voi9ture, affichage de "erreur"
 
WRInaute passionné
Merci idefix :)

Pour un contrôle limiter au lettres majuscules et minuscules + numérique + tirets + simple quote (apostrophe)
Code:
if(!preg_match("#^[A-Za-z0-9-']*$#", $st))
{
   echo 'erreur';
}
ça vous semble bon ?

ps : C'est pour un champ de recherches.
 
WRInaute accro
C'est une bonne idée de toujours mettre - au début, juste après le [. Même si dans ton cas il n'y a pas d'ambiguïté, dans de nombreux cas il peut y en avoir une (genre [a-z/-_] qui ne fait pas du tout ce que certains pourraient imaginer).

Jacques.
 
WRInaute passionné
oki, merci ;).

Par contre, je ne comprend pas l'utilisation du diese (#) ?

Une petit explication en langage simple serait bienvenue :).
 
WRInaute accro
Il y a deux parties dans une regex: l'expression elle-même, et les "flags" (i pour ignorer la casse par exemple). La structure est donc <delimiteur>expression<delimiteur>flags.

Tu peux choisir le délimiteur comme tu veux, mais si tu l'utilises dans l'expression, il faut l'"échapper" en mettant un \ avant. Le délimiteur traditionnel, qui vient de perl, puisque les regex des fonctions php pcre_* sont des "PCRE" (perl-compatible regular expressions) est le "/", mais comme il est relativement souvent utilisé, beaucoup de gens utilisent # à la place.

Jacques.
 
WRInaute discret
Jcaron a tout dit. Il me semble même que mettre le tiret à la fin est obligatoire si tu veux l'inclure dans les possibilités.
Par contre, si c'est pour un champs de recherche je crois que tu n'as pas pensé à tout. Il faut inclure les accents (qui ne seront pas inclus dans a-z, les espaces...etc.
Il y a de très bon cours sur ce sujet (les regex) sur le site du zéro.
 
WRInaute accro
Au début, le tiret, pas à la fin...

Si tu veux accepter les caractères accentués, alors la bonne solution c'est plutôt \w que d'essayer de les lister de façon exhaustive. Note que ça acceptera aussi le chinois, le japonais, l'arabe, le russe, le thaï, etc. si tu es en UTF-8.

Jacques.
 
Discussions similaires
Haut