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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Parser BBCode

n°980075
dwogsi
Défaillance cérébrale...
Posté le 13-02-2005 à 16:06:23  profilanswer
 

Reprise du message précédent :
ok je veux bien laisser tomber nl2br mais je fais comment pour mettre des <br> sur le reste du texte? Je suppose que ca doit être faisable avec un preg_replce() mais avec quelle expression réguliére? parceque la franchement je vois pas...


Message édité par dwogsi le 13-02-2005 à 16:06:48
mood
Publicité
Posté le 13-02-2005 à 16:06:23  profilanswer
 

n°980128
cerel
Posté le 13-02-2005 à 17:03:09  profilanswer
 

Bon, j'espere que le nl2br tu ne le fais que lors de l'affichage du texte, mais pas lorsque tu enregistre le message dans ta bdd...
Ensuite tu as plusieurs possibilitées :
1) Faire un usage precis du nl2br. En gros, tu ne l'utilise qu'en dehors des balises [code]. Pour le faire tu devras surement utiliser des "substr", pour prendre que le texte qui ne se trouve pas dans un [code] (ou balise equivalente), le passer via un nl2br puis l'afficher.
2) Ne pas utiliser un nl2br, mais faire ta propre fonction. Ca reviendrait presque a la solution 1, car a la fin tu va separer les deux sections.
3) Tu fais un bete nl2br sur tout ce qui passe, mais des que tu detecte un [code], tu traitre le texte a l'interieur pour y enlever les "<br />\n". Je pense que c'est faisable.
 
Donc voila, en gros tu as 2 "methodes". (Me semble qu'elles ont un nom).
La premiere methode consiste a faire du cas par cas "avant" le nl2br.
La deuxieme methode consiste a faire du cas par cas "apres" le nl2br.
 
A toi de choisir celle que tu preferes.

n°980234
dwogsi
Défaillance cérébrale...
Posté le 13-02-2005 à 19:44:22  profilanswer
 

Non c'est bon le nl2br() je ne le fait que lors de l'affichage, parce qu'après je vois pas bien comment je pourrais retravailler mes fonctions...
 
Sinon les méthodes que tu me proposent c'est bien celles auxquelles je pensais mais je ne vois toujours pas comment les appliquer.
 
Bon alors j'avais pensé à ca:

Code :
  1. $t = preg_replace("#\[code\](.*?)\[\/code\]#s",str_replace("<br />","","<pre>\\1</pre>" ),$t);


 
Mais ca ne marche pas et je comprends pas bien pourquoi...


Message édité par dwogsi le 13-02-2005 à 19:55:11
n°980257
omega2
Posté le 13-02-2005 à 20:13:56  profilanswer
 

J'ai eu la fleme de tout relire, mais pourquoi ne pas utiliser simplement htmlentities?
C'est encore le moyen le plus simple pour être sur que tous les caractéres seront bien affiché comme prévus par le programmeur.

n°980323
dwogsi
Défaillance cérébrale...
Posté le 13-02-2005 à 20:57:02  profilanswer
 

omega2 a écrit :

J'ai eu la fleme de tout relire, mais pourquoi ne pas utiliser simplement htmlentities?
C'est encore le moyen le plus simple pour être sur que tous les caractéres seront bien affiché comme prévus par le programmeur.


 
lol c'était pas vraiment la question. htmlentities je l'utilise déjà sinon je vois biens des gens balancer du js sur mon forum j'aurais pas l'air con lol.


Message édité par dwogsi le 13-02-2005 à 20:57:23
n°980329
omega2
Posté le 13-02-2005 à 20:58:48  profilanswer
 

des balises meta sufisent largement pour ne plus rien y comprendre quand on est pas protégé. ;)
Mais même avec un coup d'htmlentities, l'indentation n'est pas respecté?

n°980470
dwogsi
Défaillance cérébrale...
Posté le 13-02-2005 à 22:09:06  profilanswer
 

Je crois que tu devrais prendre le temps de lire une bonne partie au moins du topic, je crois que tu comprendrais mieux ma question.
 
Ou alors me dire ce qui ne fonctionne pas dans le dernier code que j'ai indiqué.


Message édité par dwogsi le 13-02-2005 à 22:09:38
n°980531
omega2
Posté le 13-02-2005 à 23:01:55  profilanswer
 

Il me semble pas que t'ai besoin "#" de début ni le "#s" final. D'ailleur je me souviens plus de leur signification.
 
Voilà ma regexp personelle pour transformer du bbcode en code html :

Code :
  1. $resultat=preg_replace("/".$code_deb."(.*)".$code_milieu."(.*)".$code_fin."/", $html_debut."\\1".$html_milieu."\\2".$html_fin, $saisie);


Il suffit de changer les différentes variables pour gérer n'importe quel BBCode.  
$code_milieu , je l'avais rajouté pour gérer les liens html avec l'affichage d'un texte et non pas de l'adresse. Suffit de le laisser à vide si on n'en a pas besoin à moins de l'enlever ce qui simplifie le systéme.
Cette regexp marche trés bien sur mon site donc normalement, ca devrait marchjer aussi pour toi.
 
Ton str_replace("<br />","","<pre>\\1</pre>" ) , j'ai l'impression que ca correspond purement et simplement à "<pre>\\1</pre>" vu qu'il y a pas de retour chariot dedans. Ca te simplifiera le code.
 
 
Un truc con, je crois que je viens juste de réaliser ton erreur : "\[" = echapement du caractére "[" à la création de la chaine de caractére. Il faut soit que tu doubles le "\" soit que tu mette la chaine entre simple côte.


Message édité par omega2 le 13-02-2005 à 23:05:11
n°980542
dwogsi
Défaillance cérébrale...
Posté le 13-02-2005 à 23:06:00  profilanswer
 

Bon je te donne mon code plus précisément:
 

Code :
  1. <?
  2. function format_text($t) {
  3. $t = nl2br($t);
  4. $t = preg_replace("#\[code\](.*?)\[\/code\]#s",str_replace("<br />","","<pre>\\1</pre>" ),$t);
  5. return $t;
  6. }
  7. ?>


 
Donc premièrement j'ajoute les <br /> avec nl2br() pour la totalité de la chaine.
 
Ensuite je fais en sorte que ce qui est entre les balises [code] et [ /code] soit placé entre les balises <pre> et </pre>.  
Mais comme il l'a été dit precedament dans ce topic ces balises permettent l'affichage des retour chariot donc ajouté avec les <br /> ca me donne des double retours à la ligne.
 
(le problème ne vient pas de ma regex, elle marche)
 
C'est donc pourquoi j'insére un str_replace sensé supprimer les <br /> se trouvant entre les balises [code] et [ /code], et c'est ce str_replace qui ne veut pas être effectué et je me demande donc pourquoi??
 
En passant:
# début et fin de masque
s fait en sorte que le point comprenne également les retours à la ligne (trés utile!)


Message édité par dwogsi le 13-02-2005 à 23:26:04
n°980685
soju
One shot !
Posté le 14-02-2005 à 09:01:30  profilanswer
 

Dwogsi a écrit :

c'est ce str_replace qui ne veut pas être effectué et je me demande donc pourquoi??


normal, la syntaxe de ton preg_replace n'est pas valide
sinon pour faire simple je te conseille de faire une méthode à part pour traiter ton code, par exemple :

Code :
  1. $t = preg_replace("#\[code\](.*?)\[\/code\]#Uis","parse_code('\\1')",$t);
  2. function parse_code($str)
  3. {
  4. ...
  5. }


 
 
 

mood
Publicité
Posté le 14-02-2005 à 09:01:30  profilanswer
 

n°980822
dwogsi
Défaillance cérébrale...
Posté le 14-02-2005 à 11:45:32  profilanswer
 

Oui je comptais justement y mettre une fonction pour ensuite intégrer la coloration syntaxique du code. Mais l'ennui c'est que même placé dans la nouvelle fonction ainsi crée mon str_replace() ne fonctionne toujours pas. Je me demande si au lieux de transmettre la valeur de \\1 à la fonction ca ne transmettrais pas littéralement \\1?
 
De plus si j'écris "parse_code('\\1')" ca m'affiche parse_code('le code rentré') sans passer par la fonction. Mais si je retire les guillemets ca marche. Mais toujours le même problème mon str_replace. Les preg_replace ne fonctionnent pas non plus....
 
Mais en tout cas merci à tous, ca avance petit à petit!  :D


Message édité par dwogsi le 14-02-2005 à 11:48:43
n°980857
soju
One shot !
Posté le 14-02-2005 à 12:01:04  profilanswer
 

Dwogsi a écrit :

De plus si j'écris "parse_code('\\1')" ca m'affiche parse_code('le code rentré') sans passer par la fonction


oups dsl, j'ai oublié une option :

Code :
  1. $t = preg_replace("#\[code\](.*?)\[\/code\]#Ueis","parse_code('\\1')",$t);
  2. ...


 

n°980872
dwogsi
Défaillance cérébrale...
Posté le 14-02-2005 à 12:15:40  profilanswer
 

Effectivement la ca passe dans la fonction mais mon str_replace ne veut toujours pas marcher!!! Je vous passes mon code:
 

Code :
  1. // Parser code - BBCode
  2. function parse_code($str)
  3. {
  4. $str = str_replace("\n","",$str);
  5. $str = "<table border=\"0\" width=\"100%\" style=\"border: 1 solid #000000\" bgcolor=\"#FFFFFF\" cellspacing=\"0\" cellpadding=\"2\"><tr><td width=\"100%\"><font color=\"green\"><pre>".$str."</pre></font></td></tr></table>";
  6. return $str;
  7. }
  8. function bbCode($t)
  9. // remplace les balises BBCode par des balises HTML
  10. {
  11. // Affichage pour le code
  12. $t = preg_replace("#\[code\](.*?)\[\/code\]#Ueis","parse_code('\\1')",$t);
  13. ...
  14. }


 
Arf je dois commencer à devenir chiant avec mes p'tit problèmes...


Message édité par dwogsi le 14-02-2005 à 12:23:05
n°981189
soju
One shot !
Posté le 14-02-2005 à 16:11:52  profilanswer
 

le nl2br il est avant ou apres le traitement du code ?
j'ai du mal à comprendre pourquoi tu supprimes les \n ?

n°981238
dwogsi
Défaillance cérébrale...
Posté le 14-02-2005 à 16:52:51  profilanswer
 

le nl2br est avant le traitement du bbcode donc je me retrouve avec des retours à la lignes accompagnés de <br /> donc pour ce qui se trouve entre les balises <pre> et </pre> j'ai deux solutions:
 
soit je supprime les <br />
soit je supprime les retours à la ligne (\n ou CHR(13))
 
Voilà donc de quoi expliquer la présence de ce str_replace("\n","",$str);

n°981286
soju
One shot !
Posté le 14-02-2005 à 17:24:07  profilanswer
 

ca serait plus logique de supprimer les <br />, non ?
et avec ton script il affiche le code comment ?

n°981348
dwogsi
Défaillance cérébrale...
Posté le 14-02-2005 à 18:06:19  profilanswer
 

Bah justement j'ai essayé avec les deux mais rien à faire les <br /> sont toujours là et je me demande donc pourquoi??
 
Voilà exactement ce qu'il m'affiche:
http://www.softsharing.net/main/?o [...] topic=1258
 
Tu notera donc que dans le second post les retours à la ligne sont doubles alors qu'il ne le sont pas dans la BDD.


Message édité par dwogsi le 14-02-2005 à 18:21:21
n°981403
soju
One shot !
Posté le 14-02-2005 à 18:49:46  profilanswer
 

jai testé rapidement avec le code que tu as mis, et pas de problème, ça vire le <br /> dans le code

n°981452
dwogsi
Défaillance cérébrale...
Posté le 14-02-2005 à 20:10:43  profilanswer
 

Aprés avoir fais quelques bidouilles par ci par la dans mon code, ca y est ca marche enfin!!! lol a vraiment quel bonheure de savoir que je vais pouvoir avancer sur ce p***** de forum!
 
En tout cas merci à tous, et grace a tout ca j'y comprend enfin quelque chose aux regex, preg_replace et autres choses du genre!
 
Encore merci!


Message édité par dwogsi le 14-02-2005 à 20:11:27
n°981519
dwogsi
Défaillance cérébrale...
Posté le 14-02-2005 à 20:51:13  profilanswer
 

soju a écrit :

$t = preg_replace("#\[code\](.*?)\[\/code\]#Ueis","parse_code('\\1')",$t);
...


 
Alors je vais aussi apporter une correction, j'avais pas vu mais mieux vaut ne pas mettre l'option U car sinon s'il y a deux morceau de codes dans un post ils sont combinés en un seul. Je sais pas si c'est bien clair mais si un jour quelqu'un test il s'en rendra compte assez vite tout comme moi lol.


Message édité par dwogsi le 02-04-2005 à 14:36:26
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[JavaCC]Problème pour créer un mini-parser pour prog de mathParser
Parser un string (Date)Besoin d'aide pour parser CDATA avec jdom
Besion d'aide pour un parser.Parser (Yapp/Yacc): substitution de variables ?
[C#/ASP.NET] Peut on parser un formulaire situé dans un .doc?[XML] parser un formulaire en .doc ??
bbcodeParser xml allociné
Plus de sujets relatifs à : Parser BBCode


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