1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
| // Fonction qui transforme les BBCode en HTML
function renderBBCode (&$str) {
// Je rend les tableaux de paramètres disponibles
// à ma fonction
global $bbTags;
global $htmlTags;
// Je parse les BBCode pour leur attribuer un id unique
$tmp = parseBBTags($str);
// Pour chaque tag BBCode de mes aramètres HTML
reset($htmlTags);
while (list ($key, $val) = each ($htmlTags)) {
// Je récupère le nom et les propriétés de mon tag
$curtagname = $key;
$curtagprops = $val;
// Si c'est un tag avec paramètres, je dois enlever
// le '-param' qui est à la fin.
if ($curtagprops["param"] == "yes") {
$curtagname = substr($curtagname,0,-6);
}
// Il s'agit maintenant de générer l'expression régulière ... :D
// - before : regexp pour un contenu éventuel AVANT le tag
// - tagsrch : regexp pour le tag lui-même
// - contsrch : regexp pour le contenu du tag
// - endsrch : regexp pour le tag de fermeture
// - after : regexp pour un contenu eventuel APRES le tag de fermeture
$before = "";
$tagsrch = "\[" . preg_quote($curtagname);
$contsrch = "(.*?)";
$endsrch = "";
$after = "";
// Idinces des regexp
// - idind : Indice dans la regexp de l'ID du tag (utile pour les références arrières)
// - contind : Indice du contenu du tag
// - paramind : Indice du paramètre du tag (s'il en faut un)
$idind = 0;
$contind = 1;
$paramind = 0;
// Chaine de remplacement
// - beforerepl : Debut de la chaine de remplacement
// - repl : Remplacement
// - afterrepl : Fin de la chaine de remplacement
$beforerepl = "";
$repl = "";
$afterrepl = "";
// Il s'agit de donner les bonnes valeurs aux indices et regexp maintenant
// SI le tag prend un paramètre
if ($curtagprops["param"] == "yes") {
// On rajoute le paramètre à la regexp du tag d'ouverture
$tagsrch .= "(?:=(.*?))";
// Le parametre a un indice
$paramind++;
// Du coup, l'ID et le contenu sont un cran plus loin
$idind++;
$contind++;
}
// Si le tag doit être fermé, il a un ID
if($curtagprops["close"] != "no") {
// On rajoute l'ID à la regexp du tag d'ouverture
$tagsrch .= "(:[0-9a-z]{10})";
// Du coup, l'ID a un indice
$idind++;
// Et le contenu est encore décalé d'un cran
$contind++;
// Le tag de fermeture doit être recherché avec le meme ID
// que celui d'ouverture
$endsrch = "\[/" . preg_quote($curtagname) . "\\" . $idind . "\]";
} else {
// Si le tag n'a pas de fermeture, on ne peut pas trouver de "contenu"
$contsrch = "";
}
// On rajoute le crochet de fin du tag d'ouverture
$tagsrch .= "\]";
// Si le tag doit avoir un parent, on s'assure qu'il est dans ce parent
if ($partag = $curtagprops["parent"]) {
// On cherche le tag parent d'ouverture AVANT le tag
$before = "(\[" . preg_quote($partag) . "(?:=.*?)?(:[0-9a-z]{10})\].*?)";
// Et on cherche la tag prent de fermeture APRES le tag
$after = "(.*?\[/" . preg_quote($partag) . "\\2\])";
// Du coup, le contenu est décalé de 2 cran : tag parent d'ouverture
// + ID du tag parent d'ouverture
$contind += 2;
// Pareil pour l'ID
$paramind += 2;
$idind +=2;
// On remet les tags parent avant et aprés dans la chaine de remplacement
$beforerepl = "$1";
$afterrepl = "$" . ($contind+1);
}
// Maintenant que tous les indices de position sont bons, on peut chercher
// le tag de fermeture (si besoin est)
if($curtagprops["close"] != "no") {
// Le tag de fermeture doit être recherché avec le meme ID
// que celui d'ouverture
$endsrch = "\[/" . preg_quote($curtagname) . "\\" . $idind . "\]";
}
// On remplace les valeurs {PARAM} et {VALUE} qui peuvent apparaître
// dans le HTML de remplacement. {PARAM} ets remplacé par le paramètre
// du tag BBCode, et {VALUE} par son contenu
// On en profite pour commencer la chaine de remplacement par le HTML de debut
$repl = "'" . $curtagprops["begin"] . "'";
$repl = str_replace("{VALUE}", "$" . $contind,$repl);
if ($paramind > 0) {
$repl = str_replace("{PARAM}","$" . $paramind,$repl);
} else {
$repl = str_replace("{PARAM}","",$repl);
}
// Si on veut garder le contenu entre le HTML de début et le HTML de fin
if ($curtagprops["keep"] != "no") {
// Si le contenu doit être parsé par une fonction, on y fait appel
if ($curtagprops["function"]) {
$repl .= " . " . $curtagprops["function"] . "(\"$" . $contind . "\")";
// Sinon, on affiche tout simplement le contenu (grace a son indice
// trouvé plus haut)
} else {
$repl .= " . '$" . $contind . "'";
}
}
// On finit la chaine de remplacement par le HTML de fin
$repl .= " . '" . $curtagprops["finish"] . "'";
// On assemble la chaine de remplacement
$repl = "'" . $beforerepl . "' . " . $repl . " . '" . $afterrepl . "'";
// On assemble la regexp
$srch = $before . $tagsrch . $contsrch . $endsrch . $after;
// Affichage de debug, affiche la regexp et le pattern de remplacement
// si la regexp n'est pas trouvée
// if (!preg_match("#" . $srch . "#isS", $tmp)) {
// echo $srch . " => " . htmlspecialchars($repl) . "<br />\n";
// }
// A cause de l'imbrication éventuelle des tags, on effectue
// le remplacement jusqu'à ce qu'il n'y ai plus de tag à remplacer.
while (preg_match("#" . $srch . "#isS",$tmp)) {
// Le stripslashes élimine les quelques antislah qui ont pu se glisser
// à cause du preg_quote.
//line 395
$tmp = stripslashes(preg_replace("#" . $srch . "#isSe" . $options,$repl,$tmp));
}
}
// Si jamais il reste des tags avec id qui n'ont pas été remplacés
// on enlève l'id. Le pricipe de recherche est le même que pour parseBBTags
$srch = "";
for($i=0 ; $i<count($bbTags) ; $i++) {
$srch .= preg_quote($bbTags[$i]) . "|";
}
$srch = substr($srch,0,-1);
$srch = "(\[(?:/)?(?:" . $srch . ")(?:=(?:.*?))?)(?::[0-9a-z]{10})(\])";
$tmp = preg_replace("#" . $srch . "#i","$1$2",$tmp);
// Je retourne la chaine obtenue
return $tmp;
} |
Partager