Interpreter du BBcode

  • Auteur de la discussion Auteur de la discussion code
  • Date de début Date de début
WRInaute impliqué
Bonjour,

je souhaiterais permettre aux personnes qui laissent un commentaire sur mon site de pouvoir intégrer à leur message des smilies (comme sur ce forum)


lorsque qqn clique sur un smilie, celui-ci est envoyé dans le commentaire grace à une fonction javascript.

Pour l'instant j'ai cette fonction :
<IMG alt="" src="/img/emoticones/triste.gif" onclick="javascript:emoticone('[triste]');" style="cursor: pointer;">
qui me permet d'inclure mon smilie dans le commentaire.

Le problème c'est que je n'y connais rien en bbcode. Comment faut-il parser pour ne pas avoir [triste] dans le commentaire mais bien le smilie qui doit lui être associé ?

Merci pour votre aide
 
WRInaute occasionnel
Bonjour,

Dans ce cas précis, il y a qu'un seul terme à remplacer par un smiley.
Supposons que $texte contienne le contenu de ton message, un simple replace sur cette variable, avant de l'afficher, pour remplacer toutes les occurences de [triste] par un img src avec l'émoticon associée devrait faire l'affaire.

Après, si tu désires créer un bbcode like plus complexe, avec des balises ouvrantes et fermantes, tu peux utiliser les expressions regulières et la fonction preg_replace.
Pour y voir plus clair, je te conseille un très bon cours à ce sujet :
http://www.siteduzero.com/php/regex2.php
 
WRInaute discret
J'ai fait quelques trucs comme ça sur mon site, si tu veux envoies moi un mp et je te donnerai la syntaxe de quelques expressions régulières utiles.
 
WRInaute occasionnel
S'il s'agit d'expressions régulières utiles, pourquoi ne pas tout simplement les écrire ici, afin d'être utile pour d'autres personnes également ? :)
 
WRInaute discret
Tu as raison CaYuS, soit $mes une chaîne contenant du texte mélangé avec du BBCode :

Code:
$mes=eregi_replace("\[i\:([[:alnum:]]+)\]","<i>",$mes);
$mes=eregi_replace("\[u\:([[:alnum:]]+)\]","<u>",$mes);
$mes=eregi_replace("\[/u\:([[:alnum:]]+)\]","</u>",$mes);
$mes=eregi_replace("\[/i\:([[:alnum:]]+)\]","</i>",$mes);
$mes=str_replace("[url]","",$mes);
$mes=str_replace("[/url]","",$mes);
$mes = eregi_replace(
    "([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])",
    "<A HREF=\"\\1://\\2\\3\" TARGET=\"_blank\">\\1://\\2\\3</a>",
    $mes);

Les balises u,i sont remplacées par les balises html correspondantes (on peut les effacer aussi), les balises bbcode "url" sont éffacées. La dernière expression fait un lien sur toutes les url contenues dans le texte. Manque les smileys à interpréter, ce qui devrait donner un truc du genre (pas testé) :

Code:
$mes=eregi_replace("\:([[:alnum:]]+)\:","",$mes);

Voilà :)
 
WRInaute occasionnel
Par contre, pour des raisons de sécurité (si tu veux pas que n'importe qui détruise la page en ouvrant des balises jamais fermées), je te recommande plutôt de suivre ce principe dans tes regexs :
Code:
eregi_replace('\[i\](.*?)\[/i\]', '<i>\1</i>', $message);
Comme ca, si une balise est ouverte, mais jamais fermée, le remplacement n'aura pas lieu.
Pour info, voici les regexs que j'utilise dans un petit forum fait maison :
Code:
$$text =~ s{\[img\](.+?)\[/img\]}       {<img src="$1" alt="" />}g;
$$text =~ s{\[i\](.+?)\[/i\]}           {<i>$1</i>}g;
$$text =~ s{\[u\](.+?)\[/u\]}           {<u>$1</u>}g;
$$text =~ s{\[b\](.+?)\[/b\]}           {<b>$1</b>}g;
$$text =~ s{\[s\](.+?)\[/s\]}           {<s>$1</s>}g;
$$text =~ s{\[url\](.+?)\[/url\]}       {<a href="$1">$1</a>}g;
$$text =~ s{\[quote\](.+?)\[/quote\]}   {<blockquote>$1</blockquote>}g;
$$text =~ s{\[size=(\d+)\](.+?)\[/size\]}       {<span style="font-size:$1\pt;">$2</span>}g;
$$text =~ s{\[color=(\w+)\](.+?)\[/color\]}     {<span style="color:$1;">$2</span>}g;
$$text =~ s{\[url=(.+?)\](.+?)\[/url\]}         {<a href="$1">$2</a>}g;
C'est du Perl, mais les regexs sont facilement adaptables en PHP (\d ne matche que les chiffres et \w, les caractères alpha-numériques).
 
Discussions similaires
Haut