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).

Et l'expression la plus fiable que j'ai pu trouver :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$textarea = preg_replace_callback("/(\[([\w]+)[^\]]*\])(.*)(\[\/\\2(.*)\])/U", array($this, "_baliseComplexeVersHtml"), $textarea);
La fonction _baliseComplexeVersHtml ira me chercher en base la définition n°1 de "coucou", pour faire le remplacement.

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 :
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
)
Et parce que sinon c'est trop simple, les cas que je veux pouvoir gérer sont par exemple :
[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 ;-)