implémentation du BBCode dans un forum

implémentation du BBCode dans un forum - Programmation

Marsh Posté le 18-09-2001 à 11:12:13    

salut,  
 
Je me pose des questions à propos du BBCode qui est souvent utilisé dans les forum pour formater le texte des messages :  
 
- quel est l'orifgine de ce code ?
- est il propriétaire ou bien libre ?
- comment faire pour l'implémenter dans son propre forum (à part le remplacement des [ g] par <b> par exemple lors de la sortie des texte de la base de donnée, je ne vois pas trop...
 
Car on est bien d'accord : ce code sert à ce qu'il n'y ai pas de problème de synthaxe de code html pour l'affichage de la suite de la page. Donc on désactive le code html (ou on le convertit pour qu'il ne soit pas interprétable) avant l'entrée dans la base de donnée. En sortie de la base de donnée (affichage du message) on remplace le code BBC par le code html correspondant.
Mais si un mes se trompe et ne met que [ g] et oublit de finir par [ /g] toute la suite va être en gras :ouch:
 
SVP si vous avez les algo de recherche ou des solutions du style chercher seulement "[ g]*[ /g]" que l'on remplace par "<b>*</b>"
ou un truc de ce style...

 

[edtdd]--Message édité par oloide--[/edtdd]

Reply

Marsh Posté le 18-09-2001 à 11:12:13   

Reply

Marsh Posté le 18-09-2001 à 13:48:59    

up ! :hot::hot::hot:

 

[edtdd]--Message édité par oloide--[/edtdd]

Reply

Marsh Posté le 18-09-2001 à 14:27:58    

bon,
 
on lui donne le truc ou on lui donne pas ;). Hummm, t'as un compte en suisse ? :D.

 

[edtdd]--Message édité par barbarella--[/edtdd]

Reply

Marsh Posté le 18-09-2001 à 14:32:54    

bin moi ce que j'ai fais c que je test qu'il y  a bien la chaine
 
[ b ] et [ /b ] sinon je transforme pas
 
et comme ca il n'y a pas de pb
 
moi aussi j'avais rencontré le meme pb que toi , et en se qui concerne ce code je ne pense pas qu'il ya un driot particulier , tu a le droit je pense d'utliser cette syntaxe. Au pire rien ne t'empeche de creer ta propre syntaxe , mais bon la faut demander confirmation.
 
@+++

 

[edtdd]--Message édité par saxgard--[/edtdd]

Reply

Marsh Posté le 18-09-2001 à 16:49:25    

ok, mais dans ton test, saxgard, tu remplace aussi lorsqu'il y a par exemple : [ /b] [ b] et donc ça foire tout pareil!
 
barbarella > non, je n'ai pas de compte en suisse : je suis juste un petit étudiant en biologie !:sweat:

Reply

Marsh Posté le 18-09-2001 à 17:12:53    

bon je vais te donner le truc qui te permet de conserver un temps linéaire dans la recherche de balise et leur conversion.
 
On va utiliser un tableau d'entier tab[n] ou chaque n correpond a une balise.
 
 
tu lis ta chaine A char par char et tu la copies dans une autre chaine B.
 
quand tu rencontres un [ tu testes si les char suivant forment une balise de type [X]
 
si test est positif alors tu copies la balise dans la chaine B et tu incrémentes ton tab[n] (ou n correpnd a la balsie trouvé)
 
Si négatif tu testes si c'est une balise de type [/X]
 
si test est positif alors tu copies la balise dans la chaine B et tu Décrémentes ton tab[n] (ou n correpnd a la balise trouvé)
 
Si ça ne correspond a aucune balise tu ne transforme rien. tu copies juste le char de A vers B.
 
une fois tous les char lu et la boucle fini. Tu fais une boucle qui inspecte le tableau. Si tab[n] = 1 alors tu ajoutes une balise de type [/X].
 
Personnelement j'utilise une variante de mon algo qui bloque l'imbrication pour eviter d'avoir des <B><S><B></B><B></S></B></B>
 
Je n'incrémente le tableau que s'il est a zéro (tab[n] = 0), sinon je ne transforme pas la balise et je ne décrémente que s'il est a 1 sinon je ne transforme pas.

 

[edtdd]--Message édité par barbarella--[/edtdd]

Reply

Marsh Posté le 18-09-2001 à 17:25:38    

ok merci.
 
J'imprime ta réponse et je m'isole pour y réfléchir !

Reply

Marsh Posté le 18-09-2001 à 20:49:37    

il y a des fonctions en PHP et Perl (ça dépend en quel langage est ton forum) qui permettent de gérer tout ça bien plus rapidement, avec les expressions régulières.
 
 exemple en PHP pour le tag [ b ] si ton texte est dans la variable $s
 
 $s=preg_replace("/(\[b\])(.*?)(\[\/b\])/si", "<b>\\2</b>", $s);
 
 c'est sensiblement du même tonneau en Perl avec ~s/

Reply

Marsh Posté le 18-09-2001 à 21:02:18    

plus rapide ?
 
je ne connais pas cette fonction (normal je ne maitrise pas le php. mais tu es bien obligé de relancer la fonction autant de fois que tu as de balises ? Si oui dans ce cas si tu gères 10 balises différentes tu parcours 10 fois la chaine, alors qu'avec l'algo ci-dessus c'est 1 fois.  
 
Au fait la commande elle gère les trucs du genres
 <B>..<B> ... </B>  
et ajoute la balise manquante ? m'étonnerait fort.
 
Mais explique toujours j'ai hate d'accroitre mes connaissances :)

Reply

Marsh Posté le 18-09-2001 à 21:06:15    

non ça remplace automatiquement dans tout le texte tous les couples [ b ] [ /b ]  par < b > < /b > et préserve le texte en dedans et à l'extérieur.

Reply

Marsh Posté le 18-09-2001 à 21:06:15   

Reply

Marsh Posté le 18-09-2001 à 21:09:14    

donc,
 
il faut bien lancer la fonction pour chaque balise, c'est ça ? (si le forum gère les S,B,U,I,H1,Blockquote,strong,Center,...)

Reply

Marsh Posté le 18-09-2001 à 21:11:09    

en fait elle peut paraître un peu biscornue du premier abord, mais la voici décomposée :
 
 /(\[b\])(.*?)(\[\/b\])/si
 
 - les // indiquent l'expression qui doit correspondre
 - le s à la fin signifie que la recherche doit se faire sur plusieurs lignes, càd que si le [ b ] commence sur une ligne et finit sur la suivante ça doit en tenir compte.
 - le i à la fin ignore la casse, càd qu'un [ B ] sera pris en compte
 
 ensuite il y a 3 éléments :
 
 (\[b\]) : le premier tag, j'ai du mettre des \ caractères d'échappement parce que les signes [ ] correspondent à une signalétique eux aussi
 
 (.*?) : signifie tout caractère (le .) fois (*) un nombre infini de fois (?)
 
 (\[\/b\]) : la fin du tag

Reply

Marsh Posté le 18-09-2001 à 21:17:17    

merci,
 
au fait qui a dit que le C était difficile a lire :D

Reply

Marsh Posté le 18-09-2001 à 21:17:43    

oui il faut lancer pour chaque balise.
 tout dépend de la sécurité à adopter, il y a des balises html qu'on peut tolérer (b,i,ul,li,center,etc...) et d'autres pas car elles peuvent casser la page ou provoquer des événements javascript.
 
 un petit  
 $s=strip_tags($s,"<a>,<i>,<u>,<b>,<br>,<font>,<im
g>,<marquee>,<big>,<blockquote>,<center>,<hr>,<pre
>,<small>,<ul>,<li>" );
 
 supprime tous les tags sauf ceux énumérés dans la liste

Reply

Marsh Posté le 18-09-2001 à 21:24:07    

je ne sais pas en quoi oloide programme, mais en ce qui me concerne en C la vitesse de traitement des balises est nettement plus rapide que ce que tu me montres.
 
Mais bon ça a d'autres désavantages, et puis c'est une autre discussion ;)
 
merci de l'info.

 

[edtdd]--Message édité par barbarella--[/edtdd]

Reply

Marsh Posté le 18-09-2001 à 21:27:28    

tout dépend de l'implémentation des regexp, en C ça existe aussi certainement et c'est très performant, beaucoup plus que de traiter le texte caractère par caractère et tellement plus simple :)  
 
 sur un texte long (65000 chars) ça met max 5ms pour faire le tour de 10 balises. en PHP en tout cas...

Reply

Marsh Posté le 18-09-2001 à 21:39:08    

sisi,
 
en C l'algo que j'ai donnée est rapide, pfff tu peux pas savoir :).

Reply

Marsh Posté le 18-09-2001 à 21:42:05    

oui mais va réaliser un forum en C...  :na:

Reply

Marsh Posté le 18-09-2001 à 21:47:40    

wouahou !!!
 
deweb, je te remerci car justement je fait mon forum en php et comme j'ai un bouquin qui traite seulement en 2 petites pages des expressions régulières, je ne pensais pas qu'elle étaient si puissantes !
 
J'allais justement essayer de suivre l'algo décrit par barbarella ... mais bon vu que je suis un biologiste pur et dur et que je n'ai jamais eu de cours d'info et encore moins d'algo ben ça auraiyt était un peu difficile!
 
en tout cas merci, je vais peut-être enfin finir mon forum :hello:

Reply

Marsh Posté le 18-09-2001 à 21:53:06    

Oloide,
 
en PHP la solution de deweb me parait aussi bcp plus interessante.  
 
Deweb,
 
un forum en C ... laisse moi réflechir :D
 
http://www.onversity.com/load/forum.gif

 

[edtdd]--Message édité par barbarella--[/edtdd]

Reply

Marsh Posté le 18-09-2001 à 22:28:36    

un forum en PHP... laisse-moi trouver l'url...  
 http://www.estvideo.net/forum/  :D
 made by myself :)

Reply

Marsh Posté le 18-09-2001 à 22:48:38    

arfff,
 
je sais j'aurais bien aimez pouvoir les utiliser, mais bon ... bah je commence a revoir le bout alors ça gazouille

Reply

Marsh Posté le 19-09-2001 à 09:23:43    

oloide non je ne remplace pas quand j'ai [ b] ou [ /b]
 
debut=InStr(compteur, Message2, "" )+3
fin=InStr(compteur, Message2, "
" )
If (debut>0 and fin>0 and fin>0 and (fin-debut)>0) Then
  mess=Mid(Message2,debut,(fin-debut))
  Message2=Replace(Message2, ""& mess, "<b>" & mess, 1, 1)
  Message2=Replace(Message2, "
","</b>", 1, 1)
End If
 
voilou bin c du vbscript mais bon si ca peut t'aider aussi
d'autant plus moi aussi j'avais chercher avec les expression régulière mais en vb j'avais eu des petits pb ;)
 
@++

Reply

Marsh Posté le 19-09-2001 à 10:25:03    

merci à tous, ça marche trés bien avec les expressions régulières.

Reply

Marsh Posté le 19-09-2001 à 11:05:35    

les balises ubb ca vient de Ultimate Bulletin Board, un des premiers forums commerciaux, implemente en perl.
La boite s'est ensuite renommee madrona, puis infopop ( http://www.infopop.com/ ).
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-09-2001 à 17:01:41    

deweb a écrit a écrit :

il y a des fonctions en PHP et Perl (ça dépend en quel langage est ton forum) qui permettent de gérer tout ça bien plus rapidement, avec les expressions régulières.
 
 exemple en PHP pour le tag [ b ] si ton texte est dans la variable $s
 
 $s=preg_replace("/(\[b\])(.*?)(\[\/b\])/si", "<b>\\2</b>", $s);
 
 c'est sensiblement du même tonneau en Perl avec ~s/  




 
Merci, c'est plus propre que les eregi_replace() que j'utilisais.
 
Pfff... Ces expressions régulières...  :pt1cable:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed