expression régulière

WRInaute discret
Salut à tous, :D

Je galère avec une expression régulière.
Je souhaiterais permettre au visiteur d'entrer uniquement des lettres, chiffres et utiliser seulement la ponctuation suivante :
Guillemet,tiret, apostrophe et virgule.

J'avais commencé qqch comme ceci :

Code:
if(pregmatch("^[-_\"' 0-9a-z.'-"]*$",$valeur))

Mais ça n'a pas l'air de fonctionner.



Je me demande aussi si ce serait pas mieux d'utiliser un strpos.

Une petite idée sur la meilleur méthode à utiliser ? :D
 
WRInaute discret
J'ai essayé ceci :

Code:
	if(preg_match("#[,'\"a-zA-Z0-9]#",$valeur)) 
			{
			echo 'OK';
			echo $valeur;
			}else 
			{
			echo'PAS OK';
			echo $valeur;
			}

Le problème c'est que si je tape un + par exemple, ça passe quand même alors qu'il n'est pas dans la liste de caractères admis. Pour d'autres caractères comme le point virgule, si je le mets au centre d'une chaîne ou à la fin, ça passe quand même alors qu'il n'est pas non plus dans la liste des caractères acceptés.
 
WRInaute accro
Là, ton test revient à dire "si l'un des caractères dans la liste que je donne est présent au moins une fois, alors c'est bon".

L'expression donnée par Rod utilisait un ^ au début des [] qui permet de dire que si n'importe quel caractère qui n'est PAS dans la liste est présent, alors il y a un problème.

Tu as donc le choix:
#^[listedecaracteres]+$# vrai
ou
#[^listedecaracteres]# faux

(le ^ n'a pas la même signigication dans [] et en dehors).

Jacques.
 
WRInaute accro
jcaron a dit:
Tu as donc le choix:
#^[listedecaracteres]+$# vrai
ou
#[^listedecaracteres]# faux

Pour moi cet ancrage de debut et fin de chaine (^$) est mal supporté, a chaque fois que je l'ai testé j'ai eu des bugs avec, c'est pour ca que je me sert de simple assertion comme \b,\a,\z en guise de délimitateur. Peut-etre ai-je une mauvaise manipulation de l'option \D sur mes regex car je fais beaucoup de multiligne ou je fais une fixation idiote mais de mon coté je conseillerai plutot les assertions \b,\a,\z a cet ancrage (^$) ::: #\b[listedecaracteres]+\b#
 
WRInaute accro
Dans ce cas ça ne donnerait pas du tout le résultat escompté, puisqu'il suffirait qu'il y ait un "mot" qui soit bien formé pour que ça passe, même s'il y a d'autres caractères non autorisés avant ou après...

Jacques.
 
WRInaute accro
oups j'ai pas ecrit correctemnt la regex a la fin de mon dernier post.. si je veux une alerte sur (_) et (+) ce code fonctionne tres bien, c'est plus long a ecrire mais pour moi c'est plus stable

if(preg_match("#[\b_\b|\b\+\b]+#",$valeur))
{
echo 'PAS OK';
echo $valeur;
}else
{
echo'OK';
echo $valeur;
}
 
WRInaute accro
Euh... Ta regex ne fait à mon avis pas du tout ce que tu penses qu'elle fait. Elle veut dire que ça renvoie vrai si la valeur contient au moins l'un des caractères suivants:
_
|
+
le caractère "backspace" (ASCII 8)

Au minimum ce serait plutôt #(\b_\b|\b\+\b)+# (avec des () plutôt que des []), et ça, ça renvoie vrai uniquement si tu as des _ "isolés" (i.e. pas à l'intérieur d'un mot comme_ça_par_exemple) ou des + non isolés (i.e. à l'intérieur d'un mot comme+ça+par+exemple).

Je pense que ce que tu voudrais dans ce cas ce serait plutôt #[_+]# tout simplement.

Il est probablement temps d'aller lire la doc :)

Jacques.
 
WRInaute accro
un cthi test

<?
$valeur = 'comme_ça_par_exemple';
if(preg_match("#[\b_\b|\b\+\b]+#",$valeur))
{
echo 'PAS OK';
echo $valeur;
}else
{
echo'OK';
echo $valeur;
}
?>

affiche bien 'PAS OK' et vu que je l'emploie de cette maniere ca me convient

au debut je voulais juste parler de l'utilisation de ^$.. je prefere utiliser \b\b et des qu'il s'agit de faire du multiligne je bannis d'office l'utilisation de $^, a chacun sa methode. Merci de me conseiller d'aller lire la doc, j'y manquerais pas =)
 
WRInaute accro
Comme déjà dit, ta regex va matcher "_", "+", "|" et backspace. Le \b ne sera pas du tout interprété comme "début ou fin de mot" mais comme "backspace". Le | ne sera pas interprété comme "ce qui est avant ou ce qui est après", mais comme "|". Et comme elle n'est pas ancrée et que tu ne t'en sers pas pour faire de la capture ou du remplacement, le + est inutile. Elle est donc équivalente à #[_+\b|]#.

Si tu fais tu multilignes, il convient d'utiliser le flag "m" (si tu veux que ^ et $ matchent à chaque ligne) ou pas (si tu veux qu'ils ne correspondent qu'au début ou à la fin de la chaîne complète).

Jacques.
 
Discussions similaires
Haut