Pb d'affichage de news saisie dans un formulaire

Eléphant du PHP | 331 Messages

17 déc. 2006, 12:20

Bonjour à tous !

J'ai d'une part un formulaire dans lequel un utilisateur va saisir une news. Ces paragraphes devront pouvoir être mis en forme à la manière d'une forum phpbb (utlisation de balises simples, de retours à la ligne, et d'intégration d'URL).
Je fais donc saisir à mon utilisateur des balises telles qu'on les connait.
La news est ensuite stockée dans une variable de type Varchar (1000) et enregistrée dans ma BDD.

Le problème, c'est qu'ensuite, dans la page qui m'affiche les news, je fais un simple
<?php echo $VariableNews ; ?> 
et le problème, c'est qu'à l'affichage, au lieu que mes balises soient traduites, elles sont simplement affichées entre crochet. Vous voyez ce que je veux dire ? :roll:

Ma question est donc double :
Comment faire pour faire un formulaire de saisie de news adapté (en proposant les boutons de mise en forme tels qu'ici sur ce forum) et comment faire pour qu'ensuite, cela soit correctement interprété à l'affichage?

Merci les copains !!!

NB: j'ai fait des recherches sur le BBCODE mais je n'ai rien de trouver de concret permettant de me faire avancer !

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

17 déc. 2006, 12:32

Pour résoudre ton problème d'affichage, penche toi sur la fonction str_replace() ou bien tu vas devoir tâter des expressions régulières.

Pour la saisie intuitive, FCKEditor ou TinyMCE (fouille le forum Javascript).
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphant du PHP | 331 Messages

17 déc. 2006, 13:58

J'ai un peu de mal à capter comment gérer la fonction str_replace(). Peux-tu me donner un exemple concret qui à partir de ça :

$texte = "il est champion du [b]monde[/b]";

puisse me donner l'affichage souhaité.

Pour ce qui est des expressions régulières, ça a l'air encore plus chaud ... !

Merci

Avatar du membre
ViPHP
ViPHP | 3008 Messages

17 déc. 2006, 16:43


Eléphant du PHP | 331 Messages

18 déc. 2006, 13:13

Oui, j'ai regardé la doc.
J'ai bien compris que cette fonction permet de remplacer des occurences par d'autres, mais mon problème consiste à savoir quoi mettre en remplacement de "[b]monde[/b]" par exemple.
Tout comme je ne sais pas comment indiquer des retours à la ligne.

Eléphant du PHP | 78 Messages

18 déc. 2006, 13:45

Fonction bbcode qui permet de déchiffrer le bbcode.
function bbcode($t)
// remplace les balises BBCode par des balises HTML
{
 
   // gras
   $t=str_replace("[b]", "<strong>", $t);
   $t=str_replace("[/b]", "</strong>", $t);
   
   // italique
   $t=str_replace("[i]", "<em>", $t);
   $t=str_replace("[/i]", "</em>", $t);
   
   // soulignement
   $t=str_replace("[u]", "<u>", $t);
   $t=str_replace("[/u]", "</u>", $t);
   
   $t=str_replace("[/color]", "</span>", $t);
   $regCouleur="\[color= ?(([[:alpha:]]+)|(#[[:digit:][:alpha:]]{6})) ?\]";
   $t=ereg_replace($regCouleur, "<span style=\"color: \\1\">", $t);
   
   // lien
   $regLienSimple="\[url\] ?([^\[]*) ?\[/url\]";
   $regLienEtendu="\[url ?=([^\[]*) ?] ?([^]]*) ?\[/url\]";
   if (ereg($regLienSimple, $t)) $t=ereg_replace($regLienSimple, "<a href=\"\\1\" target=\"_blank\"><span class=\"blue\">\\1</span></a>", $t);
   else $t=ereg_replace($regLienEtendu, "<a href=\"\\1\" target=\"_blank\"><span class=\"blue\">\\2</span></a>", $t);
 
    // image
   $regImage="\[img\] ?([^\[]*) ?\[/img\]";
   $regImageAlternatif="\[img ?= ?([^\[]*) ?\]";
   if (ereg($regImage, $t)) $t=ereg_replace($regImage, "<img src=\"\\1\" alt=\"\" border=\"0\" />", $t);
   else $t=ereg_replace($regImageAlternatif, "<img src=\"\\1\" alt=\"\" border=\"0\" />", $t);
   
   return $t;
}
Et a l'affichage :
<?php echo bbcode($Variable); ?>
Adapte le suivant tes besoins.

Eléphant du PHP | 331 Messages

18 déc. 2006, 15:08

Merci, c'est excatement ce qu'il me faut !

Par contre, comment gérer les retours à la ligne ?

Merci !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 déc. 2006, 15:22

Tu pourrais bien sur envisager de réaliser une fonction qui remplacerait les "\n" et "\r\n" correspondant aux retours charriot saisis dans un champ texte par des <br /> lors de l'affichage, mais puisqu'il existe une fonction nommée nl2br() qui fait ça très bien, ce serait dommage de ne pas en profiter ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 331 Messages

18 déc. 2006, 15:28

Yes !

Et puis-je combiner la fonction nl2br() avec la fonction bbcode() créée précédemment ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 déc. 2006, 15:36

bah oui :)

Il te suffit de l'appeler avant, après, pendant, quand tu veux en fait... testes la donc en différents endroits et voit ce qui est le plus pratique pour toi :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 331 Messages

19 déc. 2006, 23:02

Bon, je progresse ... !

Cependant, j'avais avant la fonction htmlentities() qui me gardait les caractères spéciaux tels que les lettres accentuées.
Depuis que j'utilise la fonction bbcode(), je n'ai plus les lettres accentuées conservées.
Puis-je combiner ces deux choses ou intégrer le htmlentities dans la fonction bbcode() ?

Merci !

Eléphant du PHP | 78 Messages

19 déc. 2006, 23:22

Combine :-)
Cordialement,
winni

Eléphant du PHP | 331 Messages

20 déc. 2006, 16:09

en fait, le problème que je rencontre, c'est qu'en écrivant ceci :
<?php echo htmlentities(bbcode($ligne_News1['DetailNews'])); ?>
J'ai bien les lettres accentuées qui appraissent mais cette fois-ci c'est la fonction bbcode qui n'agit plus.

Je m'y prends mal pour combiner ces deux fonctions ?

Eléphant du PHP | 78 Messages

20 déc. 2006, 16:32

Montre moi ton code d'insertion stp.
Cordialement,
winni

Eléphant du PHP | 331 Messages

20 déc. 2006, 16:38

Voici ma fonction bbcode :
function bbcode($t) 
// remplace les balises BBCode par des balises HTML 
{  
   // gras 
   $t=str_replace("[b:4aca2fe980]", "<strong>", $t); 
   $t=str_replace("[/b:4aca2fe980]", "</strong>", $t); 
    
   // italique 
   $t=str_replace("[i:4aca2fe980]", "<em>", $t); 
   $t=str_replace("[/i:4aca2fe980]", "</em>", $t); 
    
   // soulignement 
   $t=str_replace("[u:4aca2fe980]", "<u>", $t); 
   $t=str_replace("[/u:4aca2fe980]", "</u>", $t); 
    
   $t=str_replace("[/color]", "</span>", $t); 
   $regCouleur="\[color= ?(([[:alpha:]]+)|(#[[:digit:][:alpha:]]{6})) ?\]"; 
   $t=ereg_replace($regCouleur, "<span style=\"color: \\1\">", $t); 
    
   // lien 
   $regLienSimple="\[url\] ?([^\[]*) ?\[/url\]"; 
   $regLienEtendu="\[url ?=([^\[]*) ?] ?([^]]*) ?\[/url\]"; 
   if (ereg($regLienSimple, $t)) $t=ereg_replace($regLienSimple, "<a href=\"\\1\" target=\"_blank\"><span class=\"blue\">\\1</span></a>", $t); 
   else $t=ereg_replace($regLienEtendu, "<a href=\"\\1\" target=\"_blank\"><span class=\"blue\">\\2</span></a>", $t); 
  
    // image 
   $regImage="\[img\] ?([^\[]*) ?\[/img\]"; 
   $regImageAlternatif="\[img ?= ?([^\[]*) ?\]"; 
   if (ereg($regImage, $t)) $t=ereg_replace($regImage, "<img src=\"\\1\" alt=\"\" border=\"0\" />", $t); 
   else $t=ereg_replace($regImageAlternatif, "<img src=\"\\1\" alt=\"\" border=\"0\" />", $t); 
   
    
   return $t;  

}
?>
Et le code d'insertion est le suivant (déjà cité plus haut) :


<?php echo htmlentities(bbcode($ligne_News1['DetailNews'])); ?>
Merci !