implémentation du BBCode dans un forum - Programmation
Marsh Posté le 18-09-2001 à 13:48:59
up ! :hot::hot:
[edtdd]--Message édité par oloide--[/edtdd]
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 ? .
[edtdd]--Message édité par barbarella--[/edtdd]
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]
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:
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]
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 !
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/
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
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.
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,...)
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
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
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]
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...
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 .
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
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
[edtdd]--Message édité par barbarella--[/edtdd]
Marsh Posté le 18-09-2001 à 22:28:36
un forum en PHP... laisse-moi trouver l'url...
http://www.estvideo.net/forum/
made by myself
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
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
@++
Marsh Posté le 19-09-2001 à 10:25:03
merci à tous, ça marche trés bien avec les expressions régulières.
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+,
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...
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
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]