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


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

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

Message le Dim Oct 10, 2010 14:48

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: Tout sélectionner
if(!ereg("^[a-z-]$", $_GET['b']))
{
   echo 'erreur';
}


Visiblement mon code est faux ..

Merci

shelcko
WRInaute discret
WRInaute discret
 
Messages: 234
Inscription: 1 Jan 2007

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

Message le Dim Oct 10, 2010 15:12

Ca te met quoi comme message d'erreur ?


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

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

Message le Dim Oct 10, 2010 15:18

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.


forty
WRInaute passionné
WRInaute passionné
 
Messages: 1701
Inscription: 30 Oct 2008

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

Message le Dim Oct 10, 2010 15:23

il manque surement + ou * après les crochets


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

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

Message le Dim Oct 10, 2010 16:52

Bingo :mrgreen: un petit * et ça fonctionne .

Merci

idefix
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 319
Inscription: 17 Jan 2007

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

Message le Dim Oct 10, 2010 16:56

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: Tout sélectionner
if(!preg_match("#^[a-z-]*$#", $st))
{
   echo 'erreur';
}


Si st vaut voiture, pas d'erreur.
Si st vaut voi9ture, affichage de "erreur"


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

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

Message le Dim Oct 10, 2010 18:38

Merci idefix :)

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

ça vous semble bon ?

ps : C'est pour un champ de recherches.

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

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

Message le Dim Oct 10, 2010 18:55

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.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

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

Message le Dim Oct 10, 2010 19:15

oki, merci ;).

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

Une petit explication en langage simple serait bienvenue :).

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

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

Message le Dim Oct 10, 2010 20:11

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.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

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

Message le Dim Oct 10, 2010 23:13

Ok, merci pour tes explications jcaron :).

idefix
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 319
Inscription: 17 Jan 2007

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

Message le Dim Oct 10, 2010 23:22

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.

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

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

Message le Lun Oct 11, 2010 0:07

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.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google Bombing

  • Calculer l'indice de densité
    Cet outil vous permet de calculer l'indice de densité d'un mot-clé d'une page web. Il est calculé à la fois pour la balise TITLE, la balise META description et l'ensemble du texte de la page.
  • Suggestions de mots-clés
    Cet outil vous fournit une liste de mots sémantiquement proches du mot que vous fournissez en entrée. Il peut servir à vous donner des idées de mots à utiliser sur vos pages, voire de contenus à ajouter.
  • Suggestions Google Suggest
    Cet outil vous permet d'obtenir une liste de 10 mots ou expressions suggérés par Google sur la base d'un mot que vous fournissez.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité