JeuWeb - Crée ton jeu par navigateur
[Resolu] [PHP] Problème sur une RegExp - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Resolu] [PHP] Problème sur une RegExp (/showthread.php?tid=6722)



[Resolu] [PHP] Problème sur une RegExp - Myrina - 20-03-2013

Bonjour, j'ai une regexp qui me sert à isoler les valeurs d'une énumération MySQL.
Je pensais que ceci fonctionnait bien mais j'ai découvert un cas ou ça ne passe pas:

//Recherche des valeurs de l'énumération qui sont entre quotes et séparées par des virgules
preg_match("/enum\('(.*?)','(.*?)'(?:,'(.*?)'){0,}\)/",$type,$values);

En initialisant $type avec enum('String','Integer','Boolean','Formule'), je récupère dans $values:
Citation :enum('String','Integer','Boolean','Formule')
String
Integer
Formule

J'ai la valeur Boolean qui a mystérieusement disparue.

NB: une autre énumération ( enum('none','in','out') ) passée par le même traitement comporte bien les valeurs attendues en retour


RE: [PHP]Problème sur une RegExp - Maks - 20-03-2013

Elle est bizarre ta regex, quand tu en passes 4 ou plus ça marche pas, quand t'en passe 3 c'est bon. Pourquoi elle si compliquée aussi ?

http://rubular.com/r/Piy7W7jMiD ne suffit pas où j'ai mal suivi ?


RE: [PHP]Problème sur une RegExp - Xenos - 20-03-2013

J'en profite pour demander:
Citation :?:
Ca représente quoi?

Réponse:
Cela rend la paire de parenthèses non capturantes.

Et pour répondre à ton problème: les regexp n'ont pas de mémoire. Dans "(?:,'(.*?)')*", l'intérieur, c'est à dire le groupe (.*?), ne sera remplacé que par la dernière valeur de l'occurence. C'est pour cela que le résultat est "Formule" et non pas "Boolean" puis "Formule".

Et je ne pense pas que
Citation :'(\w+)'
Soit ce qui est recherché, car
Citation :Array('Foo', 'Bar', 'Bière')
Respecte aussi ce pattern mais n'est pas un enum.


RE: [PHP]Problème sur une RegExp - Myrina - 20-03-2013

Merci Maks pour la solution et merci Xenos pour l'explication du dysfonctionnement.

En fait, la solution sera suffisante car au moment de son utilisation, je sais déjà que j'ai à faire à une énumération donc une syntaxe figée.


RE: [Resolu] [PHP]Problème sur une RegExp - Xenos - 20-03-2013

Petit point: Si la valeur d'énumération possède une apostrophe...?
Code :
'((?:\w|\\')+)'

Test:
Citation :enum('Integer','l\'idée','Boolean','Formule','foo')

Resultat:
Citation :Match 1
1. Integer
Match 2
1. l\'idee
Match 3
1. Boolean
Match 4
1. Formule
Match 5
1. foo

Attention aussi avec "\w" si la chaine d'énumération contient des caractères autres que lettres (accentuées) chiffres ou "_".