parser de BBcode, probleme

VaN
Mammouth du PHP | 1107 Messages

27 janv. 2006, 16:08

Hello,

travaillant actuellement sur la creation d'un forum, je viens de créer une fonction qui me parse du texte, pour tranformer le bbcode en html.

Pour les balises , etc, pas de probleme.

par contre, je rencontre un probleme pour tranformer

Code : Tout sélectionner

[quote=Pseudo]...blabla..[/quote]
en

Code : Tout sélectionner

<div>Pseudo <br /> ...blabla..</div>
Comment récuperer le pseudo ? en coupant la chaine de caracteres ?
Est ce la methode utilisée pour parser du bbcode, ou existe 'il plus simple ?

Eléphant du PHP | 180 Messages

27 janv. 2006, 17:00

Salut !

J'ai eu le même pb que toi la semaine passée ! J'ai une solution qui n'est pas obligatoirement la meilleure mais cela fonctionne.

Voir mon post. J'y expose mon pb et la solution que j'ai adoptée !

A+

Didier
Giant steps are what you take ... walking on the moon ;-)

VaN
Mammouth du PHP | 1107 Messages

27 janv. 2006, 17:21

Je vois que tu utilise preg_match_all(), qui va chercher les valeurs entre " ".
<?php 
preg_match_all("|"(.*)"|U",$texte,$out,PREG_PATTERN_ORDER);

for($i=0;$i<count($out[1]);$i++) 
{ 
    $bbcode["[quote="".$out[1][$i].""]" ] = "<span class='auteur'>".$out[1][$i]." a écrit :</span><div class='citation'>"; 
} 
?>
Mais que ce passe t'il si une personne ecrit par exemple
hello, tu connais "phpfrance"
?

Cela va provoquer des erreurs nan ?

Eléphant du PHP | 180 Messages

27 janv. 2006, 17:38

Je vois que tu utilise preg_match_all(), qui va chercher les valeurs entre " ".
<?php 
preg_match_all("|"(.*)"|U",$texte,$out,PREG_PATTERN_ORDER);

for($i=0;$i<count($out[1]);$i++) 
{ 
    $bbcode["[quote="".$out[1][$i].""]" ] = "<span class='auteur'>".$out[1][$i]." a écrit :</span><div class='citation'>"; 
} 
?>
Mais que ce passe t'il si une personne ecrit par exemple
hello, tu connais "phpfrance"
?

Cela va provoquer des erreurs nan ?
Excellente remarque ... que j'ai du me faire à un moment ou à un autre après avoir posté ma solution. Je viens de vérifier le script qui tourne actuellement. Il y a une modification :
preg_match_all("|quote="(.*)"|U",$message_brut,$out,PREG_PATTERN_ORDER); // recup d'un tableau associatif $out -> pour les citations
Et là ça fonctionne très bien !

A+
Didier
Giant steps are what you take ... walking on the moon ;-)

VaN
Mammouth du PHP | 1107 Messages

27 janv. 2006, 18:34

pourrais-tu m'expliquer à quoi sert le 'U' dans |quote="(.*)"|U ?

merci

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

27 janv. 2006, 18:40

http://fr2.php.net/manual/fr/reference. ... ifiers.php

Je tiens à vous signaler qu'un parser est un mécanisme très complexe si l'on veut l'implémenter correctement donc si vous débutez en PHP (cf le nom du forum) je vous recommanderais plutôt d'utiliser une solution préexistante. (phpBB par exemple)

Eléphant du PHP | 180 Messages

27 janv. 2006, 18:43

pourrais-tu m'expliquer à quoi sert le 'U' dans |quote="(.*)"|U ?

merci
A priori à rien ;-) J'l'avais oublié celui-ci !

C'est un "oubli de nettoyage de copier-coller sur php.net" :twisted:

Sinon ça marche pour toi ? Ca t'a aidé ?

A+

Didier
Giant steps are what you take ... walking on the moon ;-)

Eléphant du PHP | 180 Messages

27 janv. 2006, 19:07

pourrais-tu m'expliquer à quoi sert le 'U' dans |quote="(.*)"|U ?

merci
A priori à rien ;-) J'l'avais oublié celui-ci !

C'est un "oubli de nettoyage de copier-coller sur php.net" :twisted:

Sinon ça marche pour toi ? Ca t'a aidé ?

A+

Didier
/!\ Mon oubli est un bon oubli ! Si tu ôtes le "U" cela ne fonctionne plus !!!!

A+

Didier
Giant steps are what you take ... walking on the moon ;-)

VaN
Mammouth du PHP | 1107 Messages

27 janv. 2006, 19:07

Je tiens à vous signaler qu'un parser est un mécanisme très complexe si l'on veut l'implémenter correctement donc si vous débutez en PHP (cf le nom du forum) je vous recommanderais plutôt d'utiliser une solution préexistante. (phpBB par exemple)
Helas je ne peux pas récupérer une solution existante, car je developpe ce nouveau forum justement pour me debarasser de phpBB.

@didgar : nan, je m'en sors pas vraiment..

Eléphant du PHP | 180 Messages

27 janv. 2006, 19:10

@didgar : nan, je m'en sors pas vraiment..
La j'ai pas trop le temps mais ce soir vers 22h00 je me rebranche et je te poste un ex concret.

/!\ contrairement à ce que je disais plus haut, le "U" a son importance.

A toute.

Didier
Giant steps are what you take ... walking on the moon ;-)

Eléphant du PHP | 180 Messages

27 janv. 2006, 23:14

@VaN

Voila un exemple complet.
J'ai développé ça dans le cadre d'une messagerie interne d'un projet sur lequel je bosse. Ce code fonctionne avec autant de niveaux de citation que le message en comporte. Il fonctionne aussi avec les citations non nominatives.

Ex :

Code : Tout sélectionner

[quote] ... bla bla ... [/quote]
Avec un peu de chance, ça devrait pouvoir s'intégrer dans ce que tu as développé pour toi.

Code : Tout sélectionner

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Document sans titre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <style type="text/css"> <!-- .citation{ margin:10px; padding:10px; border:1px solid #000; background-color:#FFF; } .auteur { font-weight:bold; margin:10px; } --> </style> </head> <body> <?php $message_brut='[quote="toto"]hello, tu connais "phpfrance" ?[/quote] ben oui "et toi" ? A+ Didier'; // ça c'est le message que te renvoie ta base de données $bbcode=array( "[quote]" => "<div class=\"citation\">", "[/quote]" => "</div>", "[b]" => "<strong>", "[/b]" => "</strong>", "[i]" => "<em>", "[/i]" => "</em>", "[u]" => "<u>", "[/u]" => "</u>" ); ////////////////////////////////////////// pour les citations ///////////////////// preg_match_all("|quote="(.*)"|U",$message_brut,$out,PREG_PATTERN_ORDER); // recup d'un tableau associatif $out -> pour les citations // voir php.net pour toutes les explications ;-) for($i=0;$i<count($out[1]);$i++) { $bbcode["[quote="".$out[1][$i].""]" ] = '<span class="auteur">'.$out[1][$i].' a écrit :</span><div class="citation">'; // fabrication à la volée du bbcode qui va bien ;-) } $print_message = str_replace(array_keys($bbcode), array_values($bbcode), $message_brut); // on mouline le message brut ou le bbcode sera remplace par du html echo '<p>'.nl2br($print_message).'</p>'; // on affiche le resultat ?> </body> </html>
J'espère que ça t'aide un minimum.

N'hésites pas à me contacter si tu as besoin ;-)

A+

Didier
Giant steps are what you take ... walking on the moon ;-)

VaN
Mammouth du PHP | 1107 Messages

31 janv. 2006, 15:20

ça marche nickel. merci bcp : )

Eléphant du PHP | 180 Messages

31 janv. 2006, 15:30

ça marche nickel. merci bcp : )
Et ben voila ! \:D/

Content de t'avoir aidé !

A+

Didier
Giant steps are what you take ... walking on the moon ;-)

VaN
Mammouth du PHP | 1107 Messages

31 janv. 2006, 15:44

je refait le meme pour les url mtnt : )
j'arrive a transformer
en http://www.phpfrance.com.

mais je me demande si il serait possible de transformer
en clic ici pour phpfrance.

EDIT : Ah bin on dirait que ça marche tout seul : )