Bonjour,

J'ai suivis le tutoriel sur le BBcode mais je me trouve bloqué lorsque je veux afficher sur mon site le contenu de la base de données qui est écrit en BBcode. Je m'explique : c'est après la requête SQL pour afficher le contenu que j’aimerais que le code fourni dans le tutoriel pour transformer le BBcode en HTML soit placé. Or avec le code qui suit, le contenu reste en BBcode (à croire que le code placé entre la requête et l’affichage est inefficace !)

Voici le code concerné :

<?php    

    $sql="SELECT * FROM news ORDER BY date DESC LIMIT 0, 8";
    $req=mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());

            $data"contenu"] = htmlentities($data"contenu"],ENT_NOQUOTES,'UTF-8');
            $conv = array(
                '\[gras\](.*?)\\/gras\]' => '<strong>$1</strong>',
                '\[italique\](.*?)\\/italique\]' => '<em>$1</em>',
                '\[souligné\](.*?)\\/souligné\]' => '<u>$1</u>',
                '\[barré\](.*?)\\/barré\]' => '<del>$1</del>',
                '\[image\](.*?)\\/image\]' => '<img src="$1"/>',
                '\[lien=([^\]]*)\](.*)\\/lien\]' => '<a href="$1">$2</a>',
                '\[citation\](.*?)\\/citation\]' => '<blockquote><p>$1</p></blockquote>',
                '\[rouge\](.*?)\\/rouge\]' => '<span style="color:red;">$1</span>',
                '\[vert\](.*?)\\/vert\]' => '<span style="color:green;">$1</span>',
                '\[violet\](.*?)\\/violet\]' => '<span style="color:purple;">$1</span>',
                '\[bleu\](.*?)\\/bleu\]' => '<span style="color:blue;">$1</span>',
                '\[jaune\](.*?)\\/jaune\]' => '<span style="color:yellow;">$1</span>',
                '\[blanc\](.*?)\\/blanc\]' => '<span style="color:white;">$1</span>',
                '\[noir\](.*?)\\/noir\]' => '<span style="color:black;">$1</span>',
                '\[orange\](.*?)\\/orange\]' => '<span style="color:orange;">$1</span>',
                '\[gris\](.*?)\\/gris\]' => '<span style="color:grey;">$1</span>'
            );
            foreach($conv as $k=>$v){
                $data"contenu"] = preg_replace('/'.$k.'/',$v,$data"contenu"]);
            }
            $data"contenu"] = nl2br($data"contenu"]);

    while($data=mysql_fetch_assoc($req)){
        echo"<h3>{$data"titre"]}</h3>";
        echo"<p>{$data"contenu"]}</p>";
        echo"<p>".date("d/m/Y",strtotime($data"date"]))."</p>";
    }
?>

4 réponses


tottosche
Réponse acceptée

Mais.... c'est parce que tu fait un traitement sur le contenu de data"contenu"] qui n'est pas initialisé et est vide! Tu n'a fais aucun fetch assoc donc le "contenu"] "n'existe pas"
Ensuite tu place le contenu de la BDD dans ta variable data et tu l'affiche tel quel...

Voici comment tu devrais faire:

<?php   
    // Declares ton tableau de conversion BBCode
    $conv = array(
        '\[gras\](.*?)\\/gras\]' => '<strong>$1</strong>',
        '\[italique\](.*?)\\/italique\]' => '<em>$1</em>',
        '\[souligné\](.*?)\\/souligné\]' => '<u>$1</u>',
        '\[barré\](.*?)\\/barré\]' => '<del>$1</del>',
        '\[image\](.*?)\\/image\]' => '<img src="$1"/>',
        '\[lien=([^\]]*)\](.*)\\/lien\]' => '<a href="$1">$2</a>',
        '\[citation\](.*?)\\/citation\]' => '<blockquote><p>$1</p></blockquote>',
        '\[rouge\](.*?)\\/rouge\]' => '<span style="color:red;">$1</span>',
        '\[vert\](.*?)\\/vert\]' => '<span style="color:green;">$1</span>',
        '\[violet\](.*?)\\/violet\]' => '<span style="color:purple;">$1</span>',
        '\[bleu\](.*?)\\/bleu\]' => '<span style="color:blue;">$1</span>',
        '\[jaune\](.*?)\\/jaune\]' => '<span style="color:yellow;">$1</span>',
        '\[blanc\](.*?)\\/blanc\]' => '<span style="color:white;">$1</span>',
        '\[noir\](.*?)\\/noir\]' => '<span style="color:black;">$1</span>',
        '\[orange\](.*?)\\/orange\]' => '<span style="color:orange;">$1</span>',
        '\[gris\](.*?)\\/gris\]' => '<span style="color:grey;">$1</span>'
    );

    // Chope tes données de ta BDD  
    $sql="SELECT * FROM news ORDER BY date DESC LIMIT 0, 8";
    $req=mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());

    // Tu fais un fetch assoc et tu traites le contenu au cas par cas
    while($data=mysql_fetch_assoc($req)){

        // Par exemple le titre, je déconseil d'appliquer un BBCode, pas top
        echo '<h3>' . htmlentities($data"titre"],ENT_NOQUOTES,'UTF-8') . '</h3>';

        // Pour le contenu: Secure -> BBCode -> retour chariot
        $data"contenu"] = htmlentities($data"contenu"],ENT_NOQUOTES,'UTF-8');
        foreach($conv as $k=>$v){
            $data"contenu"] = preg_replace('/'.$k.'/',$v,$data"contenu"]);
        }

        echo '<div id="contenu">' . $data"contenu"] = nl2br($data"contenu"]) . '</div>';

        echo '<p>' . date("d/m/Y",strtotime($data"date"])) . '</p>';
    }

?>

Au passage comme dans tout code (même pseudo-code) évite les accents et caractère spéciaux..

Ah, pour ça, avant que le message soit stocké dans la BDD, tu passe un coup de htmlentities(), tu lances ton pregreplace, et ensuite, tu stocks dans la BDD.

Kocal

bibips
Auteur

Merci de votre réponse, mais avec cette méthode le texte qui est stocké dans la base de données est en HTML ! Mais dans ce cas là, si je veux éditer le texte il sera en HTML et non en BBcode. C'est pour cela que je souhaitais transformer le BBcode en HTML lors de son affichage.

bibips
Auteur

Merci beaucoup ! Le code a fonctionné et ton explication m'a fait comprendre mon erreur et c'est que bénéfique pour la suite :)
Sinon, j'ai modifié mon code pour supprimer les accents, sympa ton conseil.