Arf, je suis emporté par ma fougue et personne pige plus rien a ce que je raconte :( Pour ton problème (remplacer des bbcodes par du html valide), il y a globalement deux cas de figure: 1/ Un remplacement simple ([video] en <video>, typiquement, ou les balises i, ou b, ou u, etc ...)
2/ Un remplacement qui nécessite ce qu'on appelle une backreference
1/ Pour le truc simple, j'i vu que tu utilises 50 000 str_replace. Je suis persuadé que ca marche sans problème, mais pour des raison des clarté du code et de perforences PHP, je te suggere a la place d'utiliser str_replace avec des tableaux (voir mieux: un seul strtr() ...)
[code]
// str_replace avec deux tableaux
$search = array( 'foo1', 'foo2', 'foo3'); // Tableau des trucs a chercher
$replace= array( 'bar1', 'bar2', 'bar3'); // Tableau des remplacements
$string = 'test test foo2 test foo1';
$newString = str_replace( $search, $replace, $string );
echo $newString // retourne: 'test test bar2 test bar1'
[/code]
A chaque occurence d'un élément existant dans l'array #search, il est remplacé par l'élément de meme index de $replace.
Mais il y a mieux: Au lieu d'utiliser deux tableaux, et au risque de te paumer entre les indexes de l'un et de l'autre, tu peux utiliser un seul tableau associatif. PHP va chercher les clés de ton array, et les remplacer par les valeurs correspondantes.
[code]
$searchAndReplace = array(
'foo1' => 'bar1', // foo1 sera remplacé par bar1
'foo2' => 'bar2', // foo2 sera remplacé par bar2
'foo3' => 'bar3' // etc ...
);
$string = 'test test foo2 test foo1';
$newString = strtr( $string, $searchAndReplace );
echo $newString // retourne: 'test test bar2 test bar1'
[/code]
C'est plus clair, plus facile a maintenir aussi.
2/ Pour les backreferences: tu cherches a trouver une portion de texte, qui contient elle-meme une partie variables que tu veux garder telle quelle (alors que ce qu'il y a autour doit changer ... c'est le cas pour des couleurs, mais aussi des tailles de police par exemple, ou des liens ...).
Ceci n'est pas possible sans utiliser les regex et preg_replace. La solution que je te donne marche pour les couleurs, a toi d'adapter ensuite pour autre chose si besoin:
[code]
$string = "test [color=#FF0040]test[/color] test";
pattern = "/(\[color=#)([a-zA-z\d]{6})(\])(.+)(\[\/color\])/i";
$replacement = '<span style="color:#{2};">${4}</span>';
newString = preg_replace(pattern, $replacement, $string);
echo $newString;
[/code]
Explications:
Si j'éclate un peu $pattern on observe 5 parenthèses:
[code]
$pattern = "/ ([color=#) ([a-zA-z\d]{6}) (]) (.+) ([\/color]) /i";
^--1 ^--2 ^--3 ^--4 ^--5
[/code]
(#1) -> cherche le début de ton tag, correspond a
[code][color=#[/code]
(#2) -> correspond au code couleur
[code]FF0040[/code]
(#3) -> correspond au crocher fermant
[code]][/code]
(#4) -> correspond a un ensemble de caractères (en l'occurence, te texte a mettre en couleur).
[code]bla bla bla mon texte qui doit etre en couleur[/code]
(#5) -> correspond a ta balise couleur fermante
[code][/color][/code]
Ce que tu veux c'est récupérer les parenthèses #2 (code couleur) et #4 (texte) pour les insérer dans tes balises html a toi. Pour cela tu dois utiliser les backreferences {2} et ${4} dans ton texte de remplacement.
Attention: ce texte doit etre écrit entre [u]simple quotes[/u] ', sinon PHP pense que tu parles de variables et lieu de backreferences:
[code]
$replacement = '<span style="color:#{2};">${4}</span>';
Utilise backreference 2 (couleur)--^ ^--Utilise backreference 4 (le texte a colorer)
[/code]
Fais le teste toi-meme avec mon code, ca sera plus simple.
Ensuite tu peux faire pareil pour les liens, les images, etc ...</video>