Nouveau sujet Répondre Imprimer Syndication RSS 2.0

[Reglé]Regex multilignes en php

Feu follet
Avatar de Duffy
  • Messages : 124
  • Inscrit : 07 Février 2006
Message édité 3 fois, dernière édition par Duffy, 15 Aout 2008, 22:16     Lien vers ce message 15 Aout 2008, 15:00
Bonjour tout le monde :)
En ce moment, j'ai un problème avec des regex, et je ne comprend vraiment pas le problèmes :s
Donc voila mon problème, je fais des test sur les regex multilignes, d'après ce que j'ai trouvé c'est l'option m à rajouter.
J'ai donc fait des test plutot concluant, genre ça :
$chaine = "T
est testo";
preg_match("!Test!smiU",$chaine,$result);


Là je n'ai de problème, je trouve le bon résultat :)

Mais si par exemple je fais ça :
$chaine = "{if:vrai}{C'est vrai}{/if}
{else}{C'est faux ;)}{/else} toto est là";
preg_match_all("!{if:(.*?)}{(.*?)}{/if}{else}{(.*?)}{/else}!smiU",$chaine,$result);


Mais voila, maintenant celle-ci ne marche pas quand c'est sur plusieurs lignes :s
Alors que si je met tout sur une seule et même ligne tout marche très bien :fsb2_goutte:
Donc là je comprend pas pourquoi là ça ne fait pas le multilignes :s

Merci d'avances et bonne vacances ;)
 
Volcan
Avatar de Talus
  • Age : 20 ans
  • Messages : 1552
  • Inscrit : 28 Septembre 2006
  Lien vers ce message 15 Aout 2008, 15:59
Qu'entends-tu par "multiligne" ? Chercher sur une seule ligne, ligne à ligne, ou que le "." soit également évalué comme étant aussi un saut de ligne ?


 
Feu follet
Avatar de Duffy
  • Messages : 124
  • Inscrit : 07 Février 2006
  Lien vers ce message 15 Aout 2008, 16:54
Par mutilignes, j'entends qu'il puisse trouver même la seconde regex, et donc que le point peut être aussi un saut de ligne :)
 
Volcan
Avatar de Talus
  • Age : 20 ans
  • Messages : 1552
  • Inscrit : 28 Septembre 2006
Message édité 1 fois, dernière édition par Talus, 15 Aout 2008, 17:33     Lien vers ce message 15 Aout 2008, 17:32
Donc l'option m te sert à rien :). Tout comme l'option U, d'ailleurs...


 
Feu follet
Avatar de Duffy
  • Messages : 124
  • Inscrit : 07 Février 2006
  Lien vers ce message 15 Aout 2008, 20:12
Ba alors il faut mettre quoi à la place du point ? Car normalement, c'est bien le caractère universelle, alors pourquoi il prend la valeur retour chariot ? Car un \n ou \r compte comme deux valeurs ?
 
Equipe des MODS
Avatar de Fabogranqi
  • Age : 19 ans
  • Messages : 3095
  • Inscrit : 29 Décembre 2004
Message édité 1 fois, dernière édition par Fabogranqi, 15 Aout 2008, 20:29     Lien vers ce message 15 Aout 2008, 20:28
Le . ne prend pas les retours à la ligne par défaut. Pour qu'il les prenne il faut rajouter l'option 's'.
 
Volcan
Avatar de Talus
  • Age : 20 ans
  • Messages : 1552
  • Inscrit : 28 Septembre 2006
  Lien vers ce message 15 Aout 2008, 20:40
Pour le \n\r, ca dépend des systeme d'exploitation, et est considéré comme étant un simple caractère "retour à la ligne" sur Windows notement.


 
Etoile
Avatar de BlackJowy
  • Age : 22 ans
  • Messages : 3477
  • Inscrit : 01 Mars 2007
  Lien vers ce message 15 Aout 2008, 21:36
C'est \r\n (CRLF), on revient au debut et descend d'ue ligne.

Je sais pas si c'est forcément LA bonne méthode mais moi je str_replace("\r\n","\n", $str); pour avoir des \n tout le temps :D


"It's backup day today so I'm pissed off. Being the BOFH, however, does have it's advantages. I reassign null to be the tape device — it's so much more economical on my time as I don't have to keep getting up to change tapes every 5 minutes. And it speeds up backups too, so it can't be all bad can it? Of course not." S.Travaglia

 
Volcan
Avatar de Sékiltoyai
  • Age : 20 ans
  • Messages : 1034
  • Inscrit : 19 Septembre 2006
  Lien vers ce message 15 Aout 2008, 21:37
Euh, ca sert à rien BJ, il est très rare que cela pose problème…


http://www.phpfrance.com : Support francophone PHP et Web.
http://sekil.labrute.fr/
 
Feu follet
Avatar de Duffy
  • Messages : 124
  • Inscrit : 07 Février 2006
Message édité 1 fois, dernière édition par Duffy, 15 Aout 2008, 21:41     Lien vers ce message 15 Aout 2008, 21:40
Le . ne prend pas les retours à la ligne par défaut. Pour qu'il les prenne il faut rajouter l'option 's'.


Eu, là je comprend pas d'ou sa peut venir, car là j'ai laisser juste l'option 's' pour le retour à la ligne, et 'i' pour ne pas faire attention à la case (si je me trompe pas), mais le preg_match_all ne me retourne toujours rien :s

Pourtant le code est le suivant :
$chaine = "{if:true}{C'est vrai}{/if}
{else}{C'est faux ;)}{/else} toto";

preg_match_all("!{if:(.*?)}{(.*?)}{/if}{else}{(.*?)}{/else}!si",$chaine,$result);
echo'<pre>',print_r($result),'</pre>';
 
Equipe des MODS
Avatar de Fabogranqi
  • Age : 19 ans
  • Messages : 3095
  • Inscrit : 29 Décembre 2004
Message édité 2 fois, dernière édition par Fabogranqi, 15 Aout 2008, 22:14     Lien vers ce message 15 Aout 2008, 22:03
Essaye ceci:

$chaine = "{if:true}{C'est vrai}{/if}
{else}{C'est faux ;)}{/else} toto";

preg_match_all("!{if:(.*?)}{(.*?)}{/if}.*?{else}{(.*?)}{/else}!si",$chaine,$result);
echo'<pre>',print_r($result),'</pre>';
 
Volcan
Avatar de Talus
  • Age : 20 ans
  • Messages : 1552
  • Inscrit : 28 Septembre 2006
Message édité 2 fois, dernière édition par Talus, 15 Aout 2008, 22:21     Lien vers ce message 15 Aout 2008, 22:12
Ou peut etre :

<?php
$chaine = '{if:true}{C'est vrai}{/if}
{else}{C'est faux}{/else} toto';

preg_match_all('`\{if:(.+?)}\{(.+?)}\{/if}.*?\{else}\{(.+?)}\{/else}`si', $chaine, $result);
echo '<pre>' . print_r($result, true) . '</pre>';


(Psst... Pour print_r, deuxieme parametre à true si on veut l'utiliser dans une conca d'un echo !).

J'ai testé, et ca marche :)

En fait, en regardant ta regex, le probleme vient du fait que tu ne cherches rien entre le {/if} et le {else}... Pas de point, pas de caractère à rechercher, donc ce soit etre collé d'après ta regex !


 
Feu follet
Avatar de Duffy
  • Messages : 124
  • Inscrit : 07 Février 2006
  Lien vers ce message 15 Aout 2008, 22:16
Merci à vous, ça marche :D
 
Volcan
Avatar de Talus
  • Age : 20 ans
  • Messages : 1552
  • Inscrit : 28 Septembre 2006
  Lien vers ce message 15 Aout 2008, 22:21
Fabo, pour ton édition, pas con le coup du * au lieu du + pour le "truc" entre \if et else :)


 
Equipe des MODS
Avatar de Fabogranqi
  • Age : 19 ans
  • Messages : 3095
  • Inscrit : 29 Décembre 2004
  Lien vers ce message 15 Aout 2008, 22:32
Euh non mon édition était pas pour faire ça ^^. Enfin comme un con, j'avais mis des parenthèses non capturant totalement inutile que j'ai enlevé.

Sinon effectivement le coup de la concaténation j'avais pas vu, j'avais juste copier/coller son code, en modifiant juste la regexp ^^
 
Répondre


.