Note informative : cet article est la suite de l’article Créer son système BBCode (côté client) que je vous invite à lire si vous ne l’avez pas encore fait.
Ici nous allons voir comment gérer les balises BBCode en PHP : interprétation des balises et transformation en code HTML.

L’architecture de base de notre classe

[pastacode lang= »php » manual= »class%20BBCode%0A%7B%0A%09protected%20static%20%24bbcodeBalises%3B%0A%09protected%20static%20%24htmlBalises%3B%0A%0A%09public%20static%20function%20bbcodeToHtml(%24content)%20%7B%7D%0A%0A%09public%20static%20function%20htmlToBbcode(%24content)%20%7B%7D%0A%0A%09protected%20static%20function%20initializeBbcodeToHtml()%20%7B%7D%0A%0A%09protected%20static%20function%20initializeHtmlToBbcode()%20%7B%7D%0A%7D%0A » message= » » highlight= » » provider= »manual »/]

Les attributs et les méthodes de notre classe PHP seront tous en statique.

Nous aurons besoin de deux attributs :
bbcodeBalises : tableau comportant la liste de toutes nos balises BBCode
htmlBalises : tableau comportant la liste de toutes les balises HTML correspondantes à nos balises BBCode

Et nous ferons appel à quatre méthodes :
bbcodeToHtml() : méthode permettant de convertir un contenu comportant des balises BBCode en code HTML
htmlToBbcode() : méthode permettant de convertir un contenu comportant du code HTML en balises BBCode
initializeBbcodeToHtml() : méthode d’initialisation des valeurs pattern et de replacement pour la conversion du BBCode en HTML
initializeHtmlToBbcode() : méthode d’initialisation des valeurs pattern et de replacement pour la conversion du HTML en BBCode

Initialisation des valeurs patterns et replacement

Au sein des méthodes initializeBbcodeToHtml() et initializeHtmlToBbcode(), nous allons initialiser les attributs $bbcodeBalises et $htmlBalises de notre classe avec les balises BBCode et leurs balises HTML correspondantes.

[pastacode lang= »php » manual= »protected%20static%20function%20initializeBbcodeToHtml()%0A%7B%0A%09self%3A%3A%24bbcodeBalises%20%3D%20array(‘%23%5C%5Bsous_titre%5D(.%2B)%5C%5B%2Fsous_titre%5D%23isU’%2C%0A%09%09%09%09%09%09%09%09%20’%23%5C%5Bp%5D(.%2B)%5C%5B%2Fp%5D%23isU’%2C%0A%09%09%09%09%09%09%09%09%20’%23%5C%5Bbr%5D%23isU’%2C%0A%09%09%09%09%09%09%09%09%20’%23%5C%5Bi%5D(.%2B)%5C%5B%2Fi%5D%23isU’%2C%0A%09%09%09%09%09%09%09%09%20’%23%5C%5Bb%5D(.%2B)%5C%5B%2Fb%5D%23isU’%2C%0A%09%09%09%09%09%09%09%09%20’%23%5C%5Bliste%5D%23isU’%2C%0A%09%09%09%09%09%09%09%09%20’%23%5C%5B%2Fliste%5D%23isU’%2C%0A%09%09%09%09%09%09%09%09%20’%23%5C%5Bliste_element%5D%23isU’%2C%0A%09%09%09%09%09%09%09%09%20’%23%5C%5B%2Fliste_element%5D%23isU’)%3B%0A%0A%09self%3A%3A%24htmlBalises%20%3D%20array(‘%3Ch2%3E%241%3C%2Fh2%3E’%2C%0A%09%09%09%09%09%09%09%20%20%20’%3Cp%3E%241%3C%2Fp%3E’%2C%0A%09%09%09%09%09%09%09%20%20%20’%3Cbr%20%2F%3E’%2C%0A%09%09%09%09%09%09%09%20%20%20’%3Cem%3E%241%3C%2Fem%3E’%2C%0A%09%09%09%09%09%09%09%20%20%20’%3Cstrong%3E%241%3C%2Fstrong%3E’%2C%0A%09%09%09%09%09%09%09%20%20%20’%3Cul%3E’%2C%0A%09%09%09%09%09%09%09%20%20%20’%3C%2Ful%3E’%2C%0A%09%09%09%09%09%09%09%20%20%20’%3Cli%3E’%2C%09%09%0A%09%09%09%09%09%09%09%20%20%20’%3C%2Fli%3E’)%3B%09%09%0A%7D%0A » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »php » manual= »protected%20static%20function%20initializeHtmlToBbcode()%0A%7B%0A%09self%3A%3A%24htmlBalises%20%3D%20array(‘%23%5C%3Ch2%3E(.%2B)%5C%3C%2Fh2%3E%23isU’%2C%0A%09%09%09%09%09%09%09%20%20%20’%23%5C%3Cp%3E(.%2B)%5C%3C%2Fp%3E%23isU’%2C%0A%09%09%09%09%09%09%09%20%20%20’%23%5C%3Cem%3E(.%2B)%5C%3C%2Fem%3E%23isU’%2C%0A%09%09%09%09%09%09%09%20%20%20’%23%5C%3Cstrong%3E(.%2B)%5C%3C%2Fstrong%3E%23isU’%2C%0A%09%09%09%09%09%09%09%20%20%20’%23%5C%3Cul%3E(.%2B)%5C%3C%2Ful%3E%23isU’%2C%0A%09%09%09%09%09%09%09%20%20%20’%23%5C%3Cli%3E(.%2B)%5C%3C%2Fli%3E%23isU’)%3B%0A%0A%09self%3A%3A%24bbcodeBalises%20%3D%20array(‘%5Bsous_titre%5D%241%5B%2Fsous_titre%5D’%2C%0A%09%09%09%09%09%09%09%09%20’%5Bp%5D%241%5B%2Fp%5D’%2C%0A%09%09%09%09%09%09%09%09%20’%5Bi%5D%241%5B%2Fi%5D’%2C%0A%09%09%09%09%09%09%09%09%20’%5Bb%5D%241%5B%2Fb%5D’%2C%0A%09%09%09%09%09%09%09%09%20’%5Bul%5D%241%5B%2Ful%5D’%2C%0A%09%09%09%09%09%09%09%09%20’%5Bli%5D%241%5B%2Fli%5D’)%3B%09%0A%7D%0A » message= » » highlight= » » provider= »manual »/]

Dans chacune des deux méthodes, le premier attribut initialisé est une expression régulière et comprend les balises pattern qui seront à remplacer. Quant au second attribut, il est initialisé avec les balises qui remplacent les balises pattern.

Si vous ne connaissez pas le fonctionnement des expressions régulières, je vous invite à consulter le tutoriel du site OpenClassrooms : Les expressions régulières

Méthodes de conversion

Pour convertir nos balises BBCodes en HTML (et inversement), nous allons utiliser les méthodes bbcodeToHtml() et htmlToBbcode().

[pastacode lang= »php » manual= »public%20static%20function%20bbcodeToHtml(%24content)%0A%7B%0A%09%24content%20%3D%20stripslashes(htmlspecialchars(nl2br(%24content)))%3B%0A%09BBCode%3A%3AinitializeBbcodeToHtml()%3B%0A%09for%20(%24i%20%3D%200%20%3B%20%24i%20%3C%20count(self%3A%3A%24bbcodeBalises)%20%3B%20%24i%2B%2B)%20%7B%0A%09%09%24content%20%3D%20preg_replace(self%3A%3A%24bbcodeBalises%5B%24i%5D%2C%20self%3A%3A%24htmlBalises%5B%24i%5D%2C%20%24content)%3B%0A%09%7D%0A%09return%20%24content%3B%0A%7D%0A » message= » » highlight= » » provider= »manual »/]

bbcodeToHtml() prend en paramètre le contenu textuel qui fera l’objet de la conversion des balises BBCode et balises HTML.

Après avoir sécurisé notre variable $content et initialisé les valeurs pattern et de replacement, nous allons utiliser une boucle For pour parcourir et scanner notre contenu textuel afin de rechercher toutes les balises BBCode présentes.

Chacune des balises BBCode trouvée sera alors automatiquement convertie avec sa version HTML correspondante à l’aide de la fonction preg_replace().

[pastacode lang= »php » manual= »public%20static%20function%20htmlToBbcode(%24content)%0A%7B%0A%09%24content%20%3D%20stripslashes(htmlspecialchars(nl2br(%24content)))%3B%0A%09BBCode%3A%3AinitializeHtmlToBbcode()%3B%0A%09for%20(%24i%20%3D%200%20%3B%20%24i%20%3C%20count(self%3A%3A%24htmlBalises)%20%3B%20%24i%2B%2B)%20%7B%0A%09%09%24content%20%3D%20preg_replace(self%3A%3A%24htmlBalises%5B%24i%5D%2C%20self%3A%3A%24bbcodeBalises%5B%24i%5D%2C%20%24content)%3B%0A%09%7D%0A%09return%20nl2br(%24content)%3B%0A%7D%0A » message= » » highlight= » » provider= »manual »/]

La méthode htmlToBbcode() a le rôle inverse de bbcodeToHtml() et a pour but de convertir les balises HTML en balises BBCodes.
La structure et le fonctionnement du code est identique, seules les valeurs de pattern et de replacement changent.

Télécharger le code source

Le code des méthodes bbcodeToHtml () et htmlToBbcode() étant assez similaire, on aurait aussi très bien pu écrire une méthode unique en ajoutant un second paramètre comme $typeConversion, utiliser une structure conditionnelle qui indiquerait quel type de conversion la méthode doit effectuer et initialiser les attributs en conséquence.
Personnellement je préfère avoir deux méthodes aux noms distincts, quitte à monopoliser quelques octets de plus dans mon fichier PHP 🙂 Mais libre vous de modifier et d’adapter le code source à votre guise 😉

N’hésitez pas à poster un commentaire et/ou partager cet article s’il vous a aidé ou si vous pensez qu’il pourra aider des personnes de votre entourage.

Pour télécharger le code source complet : Code source (partie 2)