Vérification et correction regex svp

Eléphant du PHP | 418 Messages

13 févr. 2012, 02:34

Ok je remet
if(preg_match('@<citation (.*)>(.*)<citation (.*)>(.*)<citation (.*)>(.*)<citation  (.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
J'ai essayer de voir pour définir l'espace.

Mise à part ça, et ayant lu ce qui est plus haut en essayant de comprendre, je suis même aller voir deux trois tutos sur les regex, mais je ne sais toujours pas comment indiquer mes exceptions pour que les citations simples et complexes soient prisent en compte par ma regex.

Merci de ton aide

Cordialement

ViPHP
ViPHP | 2287 Messages

13 févr. 2012, 02:36

Ok j'ai pas dû être clair... Désolé |*()

Essayons autrement... Il se passe quoi si tu enlèves simplement l'espace ? :-*
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 418 Messages

13 févr. 2012, 02:47

Oo, ok là faut que tu m'explique parce que j'ai rien compris #-o

Le simple fait d'enlever les espace devant les parenthèses joue sur le fonctionnement de la regex?

J'ai trois citations complex et une simples, et ça fonctionne Oo
if(preg_match('@<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
Merci de ton aide

EDIT: j'ai rien dit, j'ai oublier qu'on était dans la regex, et que de se fait l’espace est pris comme caractères, surtout qu'on le rend obligatoire comme tu me la citer plus haut Oo

ViPHP
ViPHP | 2287 Messages

13 févr. 2012, 03:18

Oo, ok là faut que tu m'explique parce que j'ai rien compris #-o

Le simple fait d'enlever les espace devant les parenthèses joue sur le fonctionnement de la regex?
Oui, un espace est un caractère actif participant à la définition du masque, comme presque tous les caractères (sauf ceux ayant une signification spéciale dans la syntaxe pcre, et il y en a pas mal, il est vrai :wink: ).

En supprimant l'espace de la partie "en dur" de la regexp tu as laissé le .* englober l'espace de manière optionnelle, ce qui du coup valide les deux formes de balise =D> C'est ce que j'avais tenté de t'expliquer avant.

Tu n'es donc pas obligé de tout gérer au caractère près dans une regexp. En fait, dans un souci de performance, il vaut mieux faire au plus court (mais quand même en écrivant les règles nécessaires pour que tout fonctionne bien) ;)
J'ai trois citations complex et une simples, et ça fonctionne Oo
if(preg_match('@<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)<citation(.*)>(.*)</citation>(.*)</citation>(.*)</citation>(.*)</citation>@sU',$message))
Merci de ton aide

EDIT: j'ai rien dit, j'ai oublier qu'on était dans la regex, et que de se fait l’espace est pris comme caractères, surtout qu'on le rend obligatoire comme tu me la citer plus haut Oo
Maintenant tu as une regexp qui fonctionne, bravo. =D>

Comme tu le vois cette regexp contient des répétitions importantes dans le motif. Si tu veux passer à un nouvel exercice, plus corsé, pour encore mieux maîtriser les regexp, tu peux maintenant chercher à factoriser ces répétitions :) pour rendre ta regexp à la fois plus courte et plus lisible (enfin là c'est une question de goût et de point de vue :lol: )
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 418 Messages

13 févr. 2012, 03:36

J'essayerais, je pense que ça seras un truc du genre {1,3} à la fin.
du style

'@<citation(.*)>(.*)</citation>{1,3}@sU'

non?

Sinon j'aurais une regex pour faire les listes du style

<liste>
<puce>-</puce>
<puce>-</puce>
<puce>-</puce>
</liste>

Là je la sens plus coriace Oo

Merci de ton aide

Cordialement