Petite galère avec les expressions régulières

Eléphant du PHP | 479 Messages

23 juin 2010, 09:52

Bonjour,

J'ai actuellement un petit problème avec les expressions régulières ... j'ai toujours su faire sans, mais il faut bien s'y mettre ! ;-)
Bref, j'ai un champ de formulaire dans lequel l'utilisateur peut entrer des numéros de commande, séparés par des virgules, pour faire une recherche.

Je souhaite donc vérifier que le contenu de mon champ ne soit composé que de chiffres, de virgules, et par soucis de commodité, d'espaces.
J'ai essayé différentes choses au niveau de mon masques, mais je ne m'en sors vraiment pas.

Merci !

ViPHP
ViPHP | 5462 Messages

23 juin 2010, 10:02

hello,
je te conseil cette outils http://gskinner.com/RegExr/ pour créer tes regexp :wink:

Eléphant du PHP | 314 Messages

23 juin 2010, 10:03

Je tente ma chance, sans convictions, je suis assez mauvais pour ça ^^

Code : Tout sélectionner

([0-9,\s]+)
Je traduit par

Code : Tout sélectionner

[ 0-9 -> chiffres , -> , \s -> espace ] + -> au moins une de ces choses
EDIT: tésté sur le site de stealth35 et approuvé ! :)
Cordialement,
Julien - http://laravel.fr/

Eléphant du PHP | 314 Messages

23 juin 2010, 10:14

Histoire de pousser le vice plus loin, comment faire en sorte qu'on ne puisse avoir qu'une seule virgule consécutive, et un seul espace consécutif ?
Cordialement,
Julien - http://laravel.fr/

Eléphant du PHP | 479 Messages

23 juin 2010, 10:17

Merci beaucoup !

Excellent ce site, il va vite se retrouver dans mes favoris !!!

Eléphant du PHP | 479 Messages

23 juin 2010, 10:21

Ah zut, j'ai un autre petit soucis : autant ça marche si je ne saisis que des caractères interdit, autant quand je mélange des numéros de commande valides et des caractères interdits, ça passe.
Est-ce qu'on peut indiquer dans le masque qu'on ne veut QUE ces caractères autorisés ?

Eléphant du PHP | 314 Messages

23 juin 2010, 10:23

C'est l'essence même des regex nan :?: :shock:

Pour ma part, celui que je t'ai filé marche sur le site, mais bon, c'est pas mon fort donc je laisse une personne plus compétente en juger ;)
Cordialement,
Julien - http://laravel.fr/

ViPHP
ViPHP | 5462 Messages

23 juin 2010, 10:27

Je tente ma chance, sans convictions, je suis assez mauvais pour ça ^^

Code : Tout sélectionner

([0-9,\s]+)
Je traduit par

Code : Tout sélectionner

[ 0-9 -> chiffres , -> , \s -> espace ] + -> au moins une de ces choses
EDIT: tésté sur le site de stealth35 et approuvé ! :)
oui mais du coup ca vérifie uniquement les caratere autorisé et non pas l'intégrité des données, faire : ,,,, 8,8,8,,,,,, ,,, pour lui c'est ok

d'où ta question suivante :wink:
Histoire de pousser le vice plus loin, comment faire en sorte qu'on ne puisse avoir qu'une seule virgule consécutive, et un seul espace consécutif ?
comme ca :wink:

Code : Tout sélectionner

(\d+)(?:,\s)?

Eléphant du PHP | 479 Messages

23 juin 2010, 10:32

Elle m'a l'air ésotérique la p'tite dernière. Tu pourrais m'expliquer son fonctionnement ?

Eléphant du PHP | 314 Messages

23 juin 2010, 10:42

Code : Tout sélectionner

(\d+)(?:,\s)?
Mais là tu obliges à faire une suite 'virgule espace', moi je cherchais à faire en sorte que
-'virgule'
-'espace virgule'
-'virgule espace'
-'espace virgule espace'
marchent.
Cordialement,
Julien - http://laravel.fr/

ViPHP
ViPHP | 5462 Messages

23 juin 2010, 10:43

Elle m'a l'air ésotérique la p'tite dernière. Tu pourrais m'expliquer son fonctionnement ?
c'est pas bon pour ce que tu veux faire, la ca récupèrerai tout les nombres qui sont suivie d'une virgules et d'un espace ou de la fin

(\d+) : groupe un chiffre ou plusieur

(?:,\s)? :
(?:) :c'est pour faire un groupe non capturant
,\s : virgule suivie d'un espace
? : pour dire que le groupe existe éventuellement

ViPHP
ViPHP | 5462 Messages

23 juin 2010, 10:44

Code : Tout sélectionner

(\d+)(?:,\s)?
Mais là tu obliges à faire une suite 'virgule espace', moi je cherchais à faire en sorte que
-'virgule'
-'espace virgule'
-'virgule espace'
-'espace virgule espace'
marchent.
oui, c'est que j'ai mis plus haut :wink:
ca deviens plus compliquer après :wink:

Eléphant du PHP | 314 Messages

23 juin 2010, 10:45

Je suis arrivé à

Code : Tout sélectionner

(\d+)(?:\s)?(?:,)?(?:\s)?
Comme cela, on capture par les séparateurs, et on a plus de liberté !
Cordialement,
Julien - http://laravel.fr/

ViPHP
ViPHP | 5462 Messages

23 juin 2010, 10:50

Je suis arrivé à

Code : Tout sélectionner

(\d+)(?:\s)?(?:,)?(?:\s)?
Comme cela, on capture par les séparateurs, et on a plus de liberté !
tu y'est presque :wink: par contre pas besion de faire le non capture pour la virgule :wink:

ViPHP
ViPHP | 5462 Messages

23 juin 2010, 14:34

je mets une solution parce que c'est pas un cas très simple
$str = '8 , 8, 5';
$reg = '/^(?:\d+(?:(?:\s*,\s*)(?!$))?)+$/';
	
var_dump(preg_match($reg, $str));
en supposant que

,8 , 8, 5 : n'est pas valide
8 , 8, 5, : n'est pas valide

pour ^(?:\d+(?:(?:\s*,\s*)(?!$))?)+$

on va chercher toutes les chaines qui commencent un nombre qui est éventuellement précédé par 0 ou plusieurs espace suivis d'une virgule suivis de 0 ou plusieurs espace mais pas suivis par la fin de chaine

on aurai pu aussi pousser le vice en autorisant d'autre séparateur :wink: