Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse

NodeBB

  1. Home
  2. Programmation
  3. Développement web
  4. PHP
  5. faire son propre BB-Code

faire son propre BB-Code

Scheduled Pinned Locked Moved PHP
7 Posts 4 Posters 3.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • mars073M
    mars073M
    mars073
    wrote on last edited by
    #1

    <p>
    Bonjour à tous,
    </p>
    <p>
    Donc comme si bien dit dans mon titre je vais vous expliquer comment faire un système de bbcode en php.
    </p>
    <p>
    Et pour ceux qui ne savent pas ce qu'est le bbcode c'est un système de balise utilisé principalement sur les forums par exemple ici si vous voulez mettre un image avec un lien (si comme moi vous écrivez le bbcode à la main à la place d'utiliser l'interface) vous aurez un "code" comme celui-ci:
    </p>
    <p>
     
    </p>
    <pre class="ipsCode prettyprint lang-auto prettyprinted">
    <span class="pun">[</span><span class="pln">url</span><span class="pun">=</span><span class="pln">http</span><span class="pun">:</span><span class="com">//mon_utrl/][img=mon_image.png][/url]</span></pre>
    <p>
    mais une fois traité il s'affichera sous une forme html:
    </p>
    <p>
     
    </p>
    <pre class="ipsCode prettyprint prettyprinted">
    <span class="tag"><a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"http://mon_url/"</span><span class="pln"> </span><span class="atn">target</span><span class="pun">=</span><span class="atv">"_blank"</span><span class="tag">></span><span class="pln">
    </span><span class="tag"><img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"mon_image.png"</span><span class="pln"> </span><span class="atn">border</span><span class="pun">=</span><span class="atv">"0"</span><span class="pln"> </span><span class="tag">/></span><span class="pln">
    </span><span class="tag"></a></span></pre>
    <p>
    ps: dans mon contexte les liens s'ouvrent dans un onglet et le desactive les bords pour IE
    </p>
    <p>
     
    </p>
    <p>
    Pourquoi ne pas laisser le code html aux utilisateurs/clients?
    </p>
    <p>
    Parce que celà fait une faille XSS (<a href="<base_url>/topic/479-faille-de-s%C3%A9curit%C3%A9-les-plus-fr%C3%A9quente-en-relation-directindirect-php/" rel="">plus d'info sur ce topic</a>) même si vous pouvez aussi en désactiver/activer certaines seulement.
    </p>
    <p>
     
    </p>
    <p>
    Je vais donc vous expliquer comment faire:
    </p>
    <p>
    - une balise orpheline (ex: [ img=], elle n'a aucune fermeture)
    </p>
    <p>
    - une balise non-orpheline (ex: [ code]
    </p>
    <p>
    - une balise non-orpheline + paramètre (ex: [ url=], il y a un paramètre en plus dans la balise)
    </p>
    <p>
     
    </p>
    <p>
    Donc pour faire notre bbcode vous allons utiliser ce qui s'appel des expressions régulières (aussi appelé "motif de recherche"), un truc que personnellement je n'aime pas car je me trompe souvent... Et donc une expression c'est en réalité une structure dans un texte (par exemple) on peut donc analyser s'il y a des chiffres, une chaîne de caractères ou autre, c'est souvent utilisé pour les e-mails pour voir si ce que vous avez entré ressemble à un e-mail, je ferais donc peut-être (si j'ai le courage un topic sur ça, sinon je connais <a href="http://www.expreg.com/presentation.php" rel="external nofollow">un site assez bien</a>.
    </p>
    <p>
     
    </p>
    <p>
    Bref donc nous allons commencer par une balise orpheline:
    </p>
    <p>
     
    </p>
    <pre class="ipsCode prettyprint lang-php prettyprinted">
    <span class="com">// Contexte: J'ai fais une shoutbox et je mettre en place une balise [ img=] donc <img... en html</span><span class="pln">
    $msg </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bonjour! [img=heart.gif]"</span><span class="pun">;</span><span class="pln">
    $bb </span><span class="pun">=</span><span class="pln"> </span><span class="str">'#[ img=(.+)]#iUs'</span><span class="pun">;</span><span class="pln">
    $htm </span><span class="pun">=</span><span class="pln"> </span><span class="str">'<img src="$1" border="0" />'</span><span class="pun">;</span><span class="pln">
    $msg </span><span class="pun">=</span><span class="pln"> preg_replace</span><span class="pun">(</span><span class="pln">$bb</span><span class="pun">,</span><span class="pln"> $htm</span><span class="pun">,</span><span class="pln"> $msg</span><span class="pun">);</span></pre>
    <p>
    Donc l'expression: '##iUs'
    </p>
    <p>
    - Elle est délimité par des #
    </p>
    <p>
    - On utilise les antislashes ("") avant certains caractères car ils peuvent être utilisé pour la structure (expression), caractères tels "[", "]", "(", ")", ...
    </p>
    <p>
    - "(.+)" :
    </p>
    <p>
    - - les parenthèses "()" symbolise un groupement littéral
    </p>
    <p>
    - - le point (".") symbolise qu'il peut s'agir de n'importe quel caractère et le plus ("+) symbolise qu'il peut y avoir 1 ou plusieurs caractères
    </p>
    <p>
    - "#iUs' :
    </p>
    <p>
    - - "i" effectuer une recherche insensible à la casse (par de différence entre une lettre majuscule et une minuscule).
    </p>
    <p>
    - - "U" cette option inverse la tendance à la gourmandise des expressions rationnelles.
    </p>
    <p>
    - - "s" permet au point "." de correspondre à encore plus de caractères et/ou un retour à la ligne.
    </p>
    <p>
     
    </p>
    <p>
    > <a href="http://au2.php.net/manual/fr/reference.pcre.pattern.modifiers.php" rel="external nofollow">Documentation PHP::Options de recherche</a>
    </p>
    <p>
     
    </p>
    <p>
    Maintenant une balise pour center donc [centre][/centre] devient <center></center>, je vais un peux compacter le code pour avoir plus simple:
    </p>
    <p>
     
    </p>
    <pre class="ipsCode prettyprint lang-auto prettyprinted">
    <span class="pln">$msg </span><span class="pun">=</span><span class="pln"> </span><span class="str">"[centre]Coucou![/centre]"</span><span class="pun">;</span><span class="pln">
    $msg </span><span class="pun">=</span><span class="pln"> preg_replace</span><span class="pun">(</span><span class="str">'#[centre](.+)[/centre]#iUs'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'<center>$1</center>'</span><span class="pun">,</span><span class="pln"> $msg</span><span class="pun">);</span></pre>
    <p>
    Il a donc suffit de déplacer "(.+)" et pour ceux qui n'avait pas encore compris la partie trouvée ici va remplacer le "$1", il sagit en réalité d'un tableau donc quand vous cherchez plusieurs expressions vous avez donc "$2", "$3",.. qui arrive.
    </p>
    <p>
     
    </p>
    <p>
    Nous allons donc maintenant avoir une balise avec un paramètre et pour complexer un peut on va dire que le paramètre est obligatoirement un chiffre décimal ^-^
    </p>
    <p>
     
    </p>
    <pre class="ipsCode prettyprint lang-auto prettyprinted">
    <span class="com">// balise [taille=][/taille] remplacée par <font size=""></font></span><span class="pln">
    $msg </span><span class="pun">=</span><span class="pln"> </span><span class="str">"[taille=5]Hello World! [/taille]"</span><span class="pun">;</span><span class="pln">
    $msg </span><span class="pun">=</span><span class="pln"> preg_replace</span><span class="pun">(</span><span class="str">'#[taille=(\d+)](.+)[/taille]#iUs'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'<font size="$1">$2</font>'</span><span class="pun">,</span><span class="pln"> $msg</span><span class="pun">);</span></pre>
    <p>
    Comme vous le voyait j'ai mis la mettre "\d" à la place d'un "." donc à la place de chercher n'importe quel caractère je dis que c'est un chiffre décimal et le "+" spécifie qu'il peut-être composé de plusieurs chiffres même si je pense que font-size ne peut prendre que une valeur entre 1 et 5 j'aurais pu mettre directement "([1-2-3-4-5])" mais bon je ferais une explication plus détaillée dans un prochain topic 🙂 </p>
    <p>
     
    </p>
    <p>
    PS: pour les smileys c'est un simple str_replace():
    </p>
    <p>
     
    </p>
    <pre class="ipsCode prettyprint lang-auto prettyprinted">
    <span class="pln">str_replace</span><span class="pun">(</span><span class="str">":D"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"<img src="images/smiley.gif" />"</span><span class="pun">,</span><span class="pln"> $msg</span><span class="pun">);</span></pre>
    <p>
    PPS: et si vous avez plusieurs balise directement vous pouvez faire un tableau (si vous voulez vous pouvez mettre par exemple $htm[0] = "<b>$1</b>"; et donc pour reprendre toutes les balises faites + anti-faille XSS dans une fonction:
    </p>
    <p>
     
    </p>
    <pre class="ipsCode prettyprint lang-html prettyprinted">
    <span class="pln">function BBCode($msg = '') {
    $msg = htmlentities($msg); // suprresion des caractères spéciaux (html), à placer avant les modifications sinon vous affichez le message avec les balises (en lisible)
    $bb = array(
    '#[img=(.+)]#iUs',
    '#[centre](.+)[/centre]#iUs',
    '#[taille=(\d+)](.+)[/taille]#iUs',
    '#[url=(.*)](.+)[/taille]#iUs'
    );
    $htm = array(
    '</span><span class="tag"><img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"$1"</span><span class="pln"> </span><span class="atn">border</span><span class="pun">=</span><span class="atv">"0"</span><span class="pln"> </span><span class="tag">/></span><span class="pln">',
    '</span><span class="tag"><center></span><span class="pln">$1</span><span class="tag"></center></span><span class="pln">',
    '</span><span class="tag"><font</span><span class="pln"> </span><span class="atn">size</span><span class="pun">=</span><span class="atv">"$1"</span><span class="tag">></span><span class="pln">$2</span><span class="tag"></font></span><span class="pln">',
    '</span><span class="tag"><a</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"$1"</span><span class="pln"> </span><span class="atn">target</span><span class="pun">=</span><span class="atv">"_blank"</span><span class="tag">></span><span class="pln">$2</span><span class="tag"></a></span><span class="pln">'
    );
    return preg_replace($bb, $htm, $msg);
    }

    echo BBCode("[centre]</span><span class="tag"><b></span><span class="pln">XSS</span><span class="tag"></b></span><span class="pln">[/centre]");</span></pre>
    <p></p><p>
    <strong><span style="color:#FF0000;">/!\j'ai mis des espaces dans les balises pour pouvoir publier (ex: "[ img]")!</span></strong>
    </p>
    <p>
     
    </p>
    <p>
    Bonne programmation à tous!
    </p>
    <p>
    Cordialement,
    </p>
    <p>
    Mars073
    </p>

    Aide à l'apprentissage et la réalisation pour des graphismes, des programmes, des sites ou autres.Signature aléatoire, proposez vous aussi une signature ici!

    1 Reply Last reply
    3
    • EvaelisE
      EvaelisE
      Evaelis
      wrote on last edited by
      #2

      <blockquote class="ipsQuote" data-ipsquote=""><div>
      <p> </p>
      <p><span>$msg </span><span>=</span><span> </span><span>"Bonjour! <img alt="heart.gif" src="http://heart.gif"/>"</span><span>;</span></p><p><span>$bb </span><span>=</span><span> </span><span>'#[ img=(.+)]#iUs'</span><span>;</span></p><p><span>$htm </span><span>=</span><span> </span><span>'<img src="$1" border="0" />'</span><span>;</span></p><p><span>$msg </span><span>=</span><span> preg_replace</span><span>(</span><span>$exp</span><span>,</span><span> $htm</span><span>,</span><span> $msg</span><span>);</span></p>
      </div></blockquote>
      <p>Un petit problème sur $exp</p>
      <p>Sinon bon tutoriel, qui peut utilisé avec <strong>ob_start </strong>pour un rendu plus simple (Pas forcement meilleur mais plus simple à mettre en place)</p>

       

      1 Reply Last reply
      1
      • mars073M
        mars073M
        mars073
        wrote on last edited by
        #3

        <blockquote class="ipsQuote" data-cite="Evaelis" data-ipsquote="" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentcommentid="7818" data-ipsquote-contentid="728" data-ipsquote-contenttype="forums" data-ipsquote-timestamp="1400585960" data-ipsquote-username="Evaelis"><div><p>Un petit problème sur $exp</p></div></blockquote>Ah.. oui merci j'avais mis $bb par la suite pour que ça soit plus compréhensible mais j'ai oublié de changer en dessous. ^^'<p>Personnellement je préfère preg_</p>

        Aide à l'apprentissage et la réalisation pour des graphismes, des programmes, des sites ou autres.Signature aléatoire, proposez vous aussi une signature ici!

        1 Reply Last reply
        0
        • EvaelisE
          EvaelisE
          Evaelis
          wrote on last edited by
          #4

          <blockquote class="ipsQuote" data-ipsquote=""><div>
          <p> </p>
          <p>Personnellement je préfère preg_</p>
          </div></blockquote>
          <p>Peut être une incompréhension de ma part mais ob_start n'est pas fait pour les expressions regulières mais pour retenir le flux d'une page.</p>
          <p>Ainsi :</p>
          <pre class="ipsCode prettyprint">
          function callback($buffer) {
              $lang_array = array(
              "{path}" => $_SESSION['lang'],
              "{top_menu_aboutus}" => "About Us",
              "{top_menu_register}" => "Register",
              "{top_menu_user_disconnect}" => "Disconnect",
            );
            $rval = str_replace(array_keys($lang_array),array_values($lang_array),$buffer); //Ou les expressions régulières
            return $rval;
          }
          ob_start("callback");

          //Html

          ob_end_flush();</pre>
          <p>Si ça intéresse quelqu'un, je veux bien faire un tutoriel à ce sujet.</p>

           

          1 Reply Last reply
          0
          • mars073M
            mars073M
            mars073
            wrote on last edited by
            #5

            <p>
            Non c'est plutôt moi qui me suis mal exprimé, je voulais dire je n'aime pas faire genre ça:
            </p>
            <p>
             
            </p>
            <pre class="ipsCode prettyprint lang-html prettyprinted">
            <span class="pln">function BBCode($msg) {
            $msg = htmlentities($msg); // suppresion des caractères spéciaux (html), à placer avant les modifications sinon vous affichez le message avec les balises (en lisible)
            $bb = array(
            '#[img=(.+)]#iUs',
            '#[centre](.+)[/centre]#iUs',
            '#[taille=(\d+)](.+)[/taille]#iUs',
            '#[url=(.*)](.+)[/taille]#iUs'
            );
            $htm = array(
            '</span><span class="tag"><img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"$1"</span><span class="pln"> </span><span class="atn">border</span><span class="pun">=</span><span class="atv">"0"</span><span class="pln"> </span><span class="tag">/></span><span class="pln">',
            '</span><span class="tag"><center></span><span class="pln">$1</span><span class="tag"></center></span><span class="pln">',
            '</span><span class="tag"><font</span><span class="pln"> </span><span class="atn">size</span><span class="pun">=</span><span class="atv">"$1"</span><span class="tag">></span><span class="pln">$2</span><span class="tag"></font></span><span class="pln">',
            '</span><span class="tag"><a</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"$1"</span><span class="pln"> </span><span class="atn">target</span><span class="pun">=</span><span class="atv">"_blank"</span><span class="tag">></span><span class="pln">$2</span><span class="tag"></a></span><span class="pln">'
            );
            return preg_replace($bb, $htm, $msg);
            }
            ob_start("BBCode");
            </span><span class="pun">?></span><span class="pln">
            blablabla....
            </span><span class="pun"><?</span><span class="pln">php
            ob_end_flush</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">?></span></pre>
            <p>
            mais bon c'est juste relative à ma structure pour celà que j'ai précisé "personnellement", car dans ce cas-ci j'empêche l'utilisateur utiliser du html et je lui colle le bbcode mais bon ça c'est vraiment propre à l'hygiène de code de chacun, un peu comme ceux qui use la tabulateur ou 2/4 espaces ^^
            </p>

            Aide à l'apprentissage et la réalisation pour des graphismes, des programmes, des sites ou autres.Signature aléatoire, proposez vous aussi une signature ici!

            1 Reply Last reply
            0
            • AzadA
              AzadA
              Azad
              wrote on last edited by
              #6

              <p>Très bon tutoriel, tout à fait du niveau d'un modérateur, bien joué mars.<br/>
              +1 rep.<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><span style="font-size:8px;">(Tabulateur > all)</span>.</p>

              Administrateur du forum.
              Contactez-moi par message privé ou par mail.

              1 Reply Last reply
              0
              • F
                F
                FaKe77
                wrote on last edited by
                #7

                <p>Bon tuto ! +1</p>

                1 Reply Last reply
                0

                Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                With your input, this post could be even better 💗

                Register Login
                Reply
                • Reply as topic
                Log in to reply
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes


                • Login

                • Login or register to search.
                Powered by NodeBB Contributors
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • World
                • Users
                • Groups