Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Petit probleme de regexp recursive

3 réponses
Avatar
CrazyCat
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

3 réponses

Avatar
Olivier Miakinen
Bonjour,


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.

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,


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.

$pattern = "!<bloc_([^>])+>([^<]*)</bloc_1>!Usm" ne renvoit que le
bloc 3...


Ah ? Pourtant il devrait « renvoir » les blocs 3 et 4.

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

Avatar
CrazyCat
Olivier Miakinen wrote:
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

Avatar
Olivier Miakinen
Le 18/12/2007 12:28, CrazyCat me répondait :

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:


Exact.