Bonjour,
Je me suis fait il y a quelques temps un parseur de pseudo-bbcode. Il marche bien mis à part un point bien précis que je n'arrive pas à résoudre malgré pas mal d'arrachage de cheveux.
Voici le cas qui foire :
Avec [livre] qui n'est pas une balise (donc que je veux laisser tel quel).
Code : Sélectionner tout - Visualiser dans une fenêtre à part [livre][l1]coucou[/l1]
Et l'expression la plus fiable que j'ai pu trouver :
La fonction _baliseComplexeVersHtml ira me chercher en base la définition n°1 de "coucou", pour faire le remplacement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part $textarea = preg_replace_callback("/(\[([\w]+)[^\]]*\])(.*)(\[\/\\2(.*)\])/U", array($this, "_baliseComplexeVersHtml"), $textarea);
Le problème vient du fait que \\2 ne récupère visiblement qu'une seule lettre au lieu de toute la chaine, du coup, j'ai rajouté le (.*), pour avoir la fin, mais ce n'est plus discriminant.
Donc sur un cas comme "[l88]test[/l88], ca marche, mais si une autre balise qui commence par l est juste devant, comme dans l'exemple, ce qui est pris en compte, va de la première balise a la balise fermante.
Ce que _baliseComplexeVersHtml reçois est par exemple :
Et parce que sinon c'est trop simple, les cas que je veux pouvoir gérer sont par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Array ( [0] => [l1]coucou[/l1] [1] => [l1] [2] => l [3] => coucou [4] => [/l1] [5] => 1 )
[m|12]test[/m] ==> envoyé en traitement
[m5|12]test[/m5]
[livre][l88][lune][/l88]
Bref, si un dieu des regexp passe dans le coin, je l'en remercie d'avance ;-)
Partager