Discussion:
Petit probleme de regexp recursive
(trop ancien pour répondre)
CrazyCat
2007-12-17 21:41:48 UTC
Permalink
Bonjour à tous,

j'ai un petit soucis pour faire une regexp, je ne sais même pas si c'est
possible sans utiliser une fonction.

Le but est de retrouver des blocs de contenus (un pseudo moteur de
template).

Le template:
$template = 'texte ici
<bloc_1>je suis dans le bloc 1
<bloc_2>Je suis dans le bloc 2
<bloc_3>Je suis dans le bloc 3</bloc_3>
Je suis sorti du bloc 3
</bloc_2>
Je suis sorti du bloc 2
<bloc_4>
je suis dans le bloc 4
<bloc_4>
</bloc_1>
Je suis sorti du bloc 1';

Une regexp du type:
$pattern = "!<bloc_([^>])+>(.*)<\/bloc_\\1>!Usm" ne ressort que le bloc
1 avec un preg_match_all,
$pattern = "!<bloc_([^>])+>([^<]*)<\/bloc_\\1>!Usm" ne renvoit que le
bloc 3...

Y'a-t-il un moyen, sans passer par une fonction récursive, d'extraire
tous les blocs (du plus petit au plus grand)?
--
Réseau IRC Francophone: http://www.crazy-irc.net
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Olivier Miakinen
2007-12-17 22:24:01 UTC
Permalink
Bonjour,
Post by CrazyCat
j'ai un petit soucis pour faire une regexp, je ne sais même pas si c'est
possible sans utiliser une fonction.
Le but est de retrouver des blocs de contenus (un pseudo moteur de
template).
Pour ce genre de chose, les expressions rationnelles ne sont pas
forcément la meilleure solution. D'autant plus que la syntaxe de
tes délimiteurs me semble assez adaptée à un traitement par un
interpréteur XML.
Post by CrazyCat
$template = 'texte ici
<bloc_1>je suis dans le bloc 1
<bloc_2>Je suis dans le bloc 2
<bloc_3>Je suis dans le bloc 3</bloc_3>
Je suis sorti du bloc 3
</bloc_2>
Je suis sorti du bloc 2
<bloc_4>
je suis dans le bloc 4
<bloc_4>
</bloc_1>
Je suis sorti du bloc 1';
$pattern = "!<bloc_([^>])+>(.*)<\/bloc_\\1>!Usm" ne ressort que le bloc
1 avec un preg_match_all,
Oui, c'est normal. Tous les autres blocs sont « mangés » par le .* de
l'expression pour le premier bloc.

Note que :
1) Le paramètre m ne sert à rien puisque tu n'ancres pas l'expression
avec ^ ou $.
2) Tu peux jeter un œil sur la fonctionnalité de récursivité (?R)
introduite récemment. Cela pourrait marcher.
Post by CrazyCat
$pattern = "!<bloc_([^>])+>([^<]*)<\/bloc_\\1>!Usm" ne renvoit que le
bloc 3...
Ah ? Pourtant il devrait « renvoir » les blocs 3 et 4.
Post by CrazyCat
Y'a-t-il un moyen, sans passer par une fonction récursive, d'extraire
tous les blocs (du plus petit au plus grand)?
Il y a forcément de la récursivité quelque part. Si tu as envie de
te casser la tête à faire marcher le (?R), je suis intéressé par le
résultat (mais je n'ai aucune envie d'expérimenter moi-même).

En tout cas, à ta place je chercherais plutôt par là :
http://fr2.php.net/manual/fr/ref.xml.php
CrazyCat
2007-12-18 11:28:56 UTC
Permalink
Post by Olivier Miakinen
Ah ? Pourtant il devrait « renvoir » les blocs 3 et 4.
Bon, ni toi ni moi n'avons fait gaffe à l'erreur qu'il y avait dans la
string à tester:
<bloc_4>
je suis dans le bloc 4
<bloc_4>

Et oui, je ne fermais pas le bloc :(

for ($i=0;$i<100;$i++) echo "Je suis un boulet!\n";
--
Réseau IRC Francophone: http://www.crazy-irc.net
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Olivier Miakinen
2007-12-18 12:50:29 UTC
Permalink
Post by CrazyCat
Post by Olivier Miakinen
Ah ? Pourtant il devrait « renvoir » les blocs 3 et 4.
Bon, ni toi ni moi n'avons fait gaffe à l'erreur qu'il y avait dans la
Exact.

Continuer la lecture sur narkive:
Loading...