Preg_replace un peu délicat !.. BESOIN D'AIDE SVP

thierry8

WRInaute accro
Voila je présent tout d'abord mon problème.

=>
J'ai un texte entre deux balises personnalisée, que je souhaite bien entendu en forme. Un exemple sera plus compréhensible:
[BALISE=1]mon texte[/BALISE]
=
<span id="1">mon texte</span>

=>
Pour ce cas je n'ai pas de problème en faisant ainsi:
preg_replace('`\[BALISE=([0-9]+)\](.+)\[/BALISE\]`is', '<span id="$1">$2</span>', $texte)

=>
En revanche lorsqu'il y en a un dans un autre, j'ai un problème, exemple:
[BALISE=1]mon texte[BALISE=2]mon texte[/BALISE]mon texte[/BALISE]
=
<span id="1">mon texte[BALISE=2]mon texte</span>mon texte[/BALISE]
(la première balise correspond au rouge et se ferme avec la balise orange, cela ne coincïde pas)

Or je souhaiterai ce résultat:
<span id="1">mon texte<span id="2">mon texte</span>mon texte</span>


J'espère que quelqu'un voudra bien m'aider, car j'ai vraiment beaucoup de difficulté sur ce point, et je ne sais absolument pas comment faire.
Merci.
 

SuperPJ

WRInaute occasionnel
Avec des balises personnalisées qui s'encastrent c'est compliqué de le faire en une seule expression régulière ... personnellement voici ce que je ferais (je ne sais pas si ça te conviendra mais bon c'est déjà ça ;) ):
Code:
<?

$texte = '[BALISE=1]mon texte[BALISE=2]mon texte[/BALISE]mon texte[/BALISE]';

$chercher = array
(
	'!\[BALISE=(\d+)\]!is',
	'!\[/BALISE\]!is',
);

$remplacer = array
(
	'<span id="\1">',
	'</span>',
);

$texte = preg_replace( $chercher, $remplacer, $texte );

echo $texte;

// <span id="1">mon texte<span id="2">mon texte</span>mon texte</span>

?>
 

Jul-Wup

WRInaute discret
Un bon test à faire, c'est avec
$texte = '[BALISE=1]mon texte[BALISE=2]mon texte[/BALISE][BALISE=3]mon textemon texte[/BALISE]';

Et là, ça remplace [BALISE=3] par le span associé. Ce qui pose des problèmes avec les tableaux, bold etc... pour la mise en page.
 

thierry8

WRInaute accro
Jul-Wup a dit:
Un bon test à faire, c'est avec
$texte = '[BALISE=1]mon texte[BALISE=2]mon texte[/BALISE][BALISE=3]mon textemon texte[/BALISE]';

Et là, ça remplace [BALISE=3] par le span associé. Ce qui pose des problèmes avec les tableaux, bold etc... pour la mise en page.
Oui en effet, merci SuperPJ mais cette solution ne fonctionne pas pour la raison citée ci-dessus et pour d'autres encore...

Si quelque avait encore une idée..... :(
 

lefou

WRInaute discret
En espérant que cela puisse t'aider :
$texte=preg_replace("/\[BALISE=([0-9]+)\]/i","<balise id=\\1>",$texte);
$texte=preg_replace("/\[/BALISE\]/i","</balise>",$texte);
En fait je traîte la balise ouvrante et la balise fermante séparément.

Ceci va bien pour l'affichage mais pose problème pour la création d'un nouveau texte. En effet, en supposant que [BALISE]texte[/BALISE] met le texte en gras, cela fonctionnera aussi si on n'a que [BALISE]texte (car le formatage aura lieu). Le truc est donc de tester au moment de l'enregistrement du texte s'il y a autant de balises [BALISE] que de balises [/BALISE] avec affichage d'un message d'erreur si ce n'est pas le cas (utilisation de la fonction substr_count pour chercher le nombre d'occurances dans le texte).
 

Discussions similaires

Haut