Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1345 connectés 

 


Dernière réponse
Sujet : implémentation du BBCode dans un forum
Freekill

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:


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Freekill

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:

gilou 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+,
oloide merci à tous, ça marche trés bien avec les expressions régulières.
saxgard 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 ;)
 
@++
barbarella arfff,
 
je sais j'aurais bien aimez pouvoir les utiliser, mais bon ... bah je commence a revoir le bout alors ça gazouille
deweb un forum en PHP... laisse-moi trouver l'url...  
 http://www.estvideo.net/forum/  :D
 made by myself :)
barbarella 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]

oloide 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:
deweb oui mais va réaliser un forum en C...  :na:
barbarella sisi,
 
en C l'algo que j'ai donnée est rapide, pfff tu peux pas savoir :).
deweb 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...
barbarella 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]

deweb 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
barbarella merci,
 
au fait qui a dit que le C était difficile a lire :D
deweb 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
barbarella 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,...)
deweb 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.
barbarella 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 :)
deweb 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/
oloide ok merci.
 
J'imprime ta réponse et je m'isole pour y réfléchir !
barbarella 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]

oloide 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:
saxgard 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]

barbarella 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]

oloide up ! :hot::hot::hot:

 

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

oloide 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]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR