Petit probleme de regexp recursive

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #63758
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 = "! 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

CrazyCat
Le #63450
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

Olivier Miakinen
Le #63448
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.


Publicité
Poster une réponse
Anonyme