Bonjour à tous !
A travers ce petit exercice, je vous propose d’intégrer le célèbre colorateur syntaxique GeSHi dans votre BBCode (ou autre, Zcode par exemple).
Le fonctionnement de GeSHi :
Tout d’abord, si ce n’est pas déjà fait, téléchargez GeSHi et uploadez-le sur votre FTP, dans un dossier à part, pour plus de clarté ![]()
Pour l’utiliser, voici comment procéder :
include_once('geshi/geshi.php'); // Remplacez geshi par votre dossier.
$code = ""; // Code à colorer
$langage = 'php'; // Langage à utiliser pour colorer le code
$geshi = new GeSHi($code, $langage); // Création de l'objet GeSHi
echo $geshi->parse_code(); // Affichage du code coloré via la méthode parse_code de l'objet GeSHi
?>
Consignes et contraintes :
- Pour insérer du code dans notre BBCode, nous taperons
Code
- A l’enregistrement de notre textarea dans la BDD, nous utiliserons mysql_escape_string pour nous protéger des inclusions MySql
- A l’affichage, nous récupérons le contenu de la table et nous sécuriserons son affichage
$contenu = stripslashes($contenu); $contenu = htmlspecialchars($contenu); echo bbcode($contenu); // Fonction comprenant nos diverses regex chargées de transformer notre BBCode en html
- Note : Avec GeSHi, pour colorer en html, le langage à saisir est html4strict, mais dans notre BBCode, nous taperons [ code=html]Code[/ code]. A vous de vous arranger ![]()
- On affichera le nom du langage au-dessus du code coloré.
Correction :
Note : La correction ci-dessous n’est pas forcément la seule manière de procéder.
include_once('geshi/geshi.php'); // On inclus la bibliothèque GeSHi
function colore($matches) // Fonction faisant appel à GeSHi, prenant en paramétre les options souhaitées dans le preg_replace_callback
{
$languages_autorises = array("php", "html", "css", "javascript", "apache", "mysql"); // Tableau listant les langages autorisés
if (in_array($matches[1], $languages_autorises)) { // Si le langage se trouve dans le tableau ci-dessus
if ($matches[1] == "html") // Si le langage est html, nous le convertirons en html4strict et le langage affiché sera : html
{ $matches[1] = "html4strict"; $language = "html"; }
else
{ $language = $matches[1]; } // Sinon le langage à afficher sera le nom du langage utilisé pour la coloration (il n'y a que html qui change)
$geshi = new GeSHi(html_entity_decode(trim($matches[2])), $matches[1]); // Création de l'objet GeShi, on décode les caractéres que htmlspecialchars à fait et on supprime les espaces au début et fin de chaîne
return 'Code '.strtoupper($language).'
'.$geshi->parse_code(); // On retourne le code coloré
}
else {// Si le langage de coloration souhaité ne se trouve pas dans le tableau
return 'Code AUTRE
<pre>'.html_entity_decode(trim($matches[2])).'</pre>
'; // On n'affiche le code sans lui faire de traitement
}
}
function bbcode($cont) { // Fonction BBCode comprenant les regex pour parser notre texte
$cont = preg_replace_callback('`\\[code=(.*)\\](.*)\\[/code\\]`isU', 'colore', $cont); // Remplace en utilisant la fonction colore
// Vos remplacements ici : par exemple [gras] [/gras] ...
$cont = trim($cont); // Suppresion des espaces en début et fin de chaîne
return $cont;
}
// Utilisation :
$contenu = stripslashes($contenu);
$contenu = htmlspecialchars($contenu);
echo bbcode($contenu);
?>
Et voilà
Bravo à ceux qui ont réussit à faire marcher GeSHi dans leur système de BBCode !
Note : La fonction bbcode ci-dessus reste entièrement sécurisée. Néanmoins, faites attention à vos remplacements et vos regex !
Note 2 : Suite au commentaire de Blogiwi, il est évident que vous pouvez tester directement si le langage fournis dans
[/code]
est un langage attendu en incluant directement la condition dans la regex.
