Version complète: sur le forum Webmaster Hub : Remplacer [ par <
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
Loupilo
Salut à tous,
je dispose d'un script de libre tribune basique.
Par sécurité, il n'accepte pas le html. Je pense donc mettre en place du "bbcode". Pour cela, dans ma page "lire.php", qui affiche la tribune, il faudrait qu'il y ait une fonction remplaçant par
CODE
[b] par <strong>, [/b] par </strong>, etc. ...


Est déjà inclu dans le script une fonction pour les smileys :
CODE
$news['texte']=eregi_replace(':\)','<img src="images/content.gif" align="middle" border="0" alt=":\)" />', $news['texte']);


Seulement
CODE
$news['texte']=eregi_replace('[b]','<strong>', $news['texte']);

provoque le remplacement de toutes les lettres "b" dans la page par <strong>...

Et pour que
CODE
</strong> remplace [/b]
, alors la ça ne marche pas du tout...

Au final, j'ai une page tout en gras vu que tout mes b sont remplacés par <strong>, et j'ai toujours
CODE
mes [b] et [/b]

biggrin.gif
Ca me desespere....

Merci de votre précieuse aide wink.gif

++
Country
Pour cela tu peut utiliser str_replace()

CODE
$news['texte']=str_replace('[b]','<strong>', $news['texte']);


et pareil avec [/b] et </strong> wink.gif
Anonymus
J'ajouterais que str_replace peut prendre, en parametre, des tableaux.

Ainsi, au lieu de mettre, une fonction str_replace pour chaque terme à remplacer, il sera plus aisé de faire :

CODE
$array_search=array("[b]","[/b]");
$array_replace = array("<strong>","</strong>");
$new_txt = str_replace($array_search,$array_replace,$txt);


Anonymus.
Loupilo
CITATION(Anonymus @ jeudi 06 mai 2004, 14:31)
J'ajouterais que str_replace peut prendre, en parametre, des tableaux.

Ainsi, au lieu de mettre, une fonction str_replace pour chaque terme à remplacer, il sera plus aisé de faire :

CODE
$array_search=array("[b]","[/b]");
$array_replace = array("<strong>","</strong>");
$new_txt = str_replace($array_search,$array_replace,$txt);


Anonymus.

Donc je devrais faire :


CODE
$array_search=array("[b]","[/b]");
$array_replace = array("<strong>","</strong>");
$new_txt = str_replace($array_search,$array_replace,$txt);
$array_search=array("[i]","[/i]");
$array_replace = array("<em>","</em>");
$new_txt = str_replace($array_search,$array_replace,$txt);
$array_search=array("[u]","[/u]");
$array_replace = array("<em>","</em>");
$new_txt = str_replace($array_search,$array_replace,$txt);


comme ça, tout à la suite ?

Sinon, merci beaucoup à vous deux :yoot:

++ wink.gif
Anonymus
Euh.. non, justement biggrin.gif

CODE
$array_search=array("[b]","[/b]","[i]","[/i]","[u]","[/u]");

$array_replace = array("<strong>","</strong>","<em>","</em>","<em>","</em>");

$new_txt = str_replace($array_search,$array_replace,$txt);

Chaque terme du tableau 'search' sera remplacé par le terme du tableau 'replace', à 'index' équivalent. Autrement dit, le 1er de 'search' sera remplacé par le 1er de 'replace', le 2e de 'search' sera remplacé par le 2e de 'replace', etc..

Anonymus.
Country
L'avantage de passer un tableau en paramètre est bien evidement de ne pas avoir 36 str_replace() à la suite comme dans ton code wink.gif
Loupilo
Et bien seule la solution de country marche...
C'est sur que le code est plus long, mais ça fonctionne tongue.gif

Pour ton idée Anonymus, il ne se passe rien dans le code...

merci beaucoup wink.gif

++
Anonymus
Chez moi, mon code marche. Tu n'aurais pas fait une erreur quelque part ?

ou alors.. n'aurais tu pas remplacé les variables ? biggrin.gif

Essaie ceci :
CODE
$array_search=array("[b]","[/b]","[i]","[/i]","[u]","[/u]");

$array_replace = array("<strong>","</strong>","<em>","</em>","<em>","</em>");

$news['texte'] = str_replace($array_search,$array_replace,$news['texte']);


Anonymus.
Xethorn
Donc vous, vous voulez transformer du BBcode en HTML et vous n'utilisez pas les regex ? Donc si quelqu'un écrit : [ b ], il aura un <strong> qui arrivera. Mais s'il oublit de mettre un [/ b ] il se passera quoi au niveau du code XHTML ? Il sera invalide.

D'ou, la solution (utililsé sur mon parseur personnel) :
CODE
<?php
$txt = ' Texte ordinaire [b]Texte en gras[/b] Ordinaire';
$txt = preg_replace('#\[b\](.+)\[/b\]#','<strong>\1</strong>',$txt);
echo $txt;
?>


Je n'ai pas testé le code source (je viens de l'écrire de tête), merci de dire s'il marche ou s'il y a des bugs avec un texte du style :
CITATION
Texte ordinaire [ b ]Texte en gras[/ b ] Ordinaire [ b ]Texte en gras[/ b ]
Country
C'est vrai qu'il est plus propre de remplacer le code seulement si il y a la balise ouvrante ET fermante.

Xelhorn, il y a un petit bug dans ton code, si il y a 2 texte en gras à la suite, il remplace juste les balises aux extrémitées.

Voici le code corrigé:
CODE
<?php
$txt = ' Texte ordinaire [b]Texte en gras[/b] Ordinaire [b]Texte en gras[/b]';
$txt = preg_replace("/\[b\](.+?)\[\/b\]/", "<b>$1</b>", $txt);
echo $txt;
?>


Après il faudrai rajouter une fonction pour supprimer les balises non fermées qu'il resterai trainer wink.gif
Xethorn
Surtout pas ! Après tu ne sauras pas où tu as fait l'erreur, le mieux ne serait pas de les supprimer mais plus de les mettre en couleur smile.gif
Xethorn
Tient, au passage : http://pear.php.net/packages.php?catpid=10&catname=HTML, personnellement, j'ai fais mon propre système mais c'est avec le style wiki, mais si tu n'as pas le temps de faire ton propre script, ça peut-être utile pour dépaner.
Loupilo
CITATION(Xethorn @ vendredi 07 mai 2004, 18:59)
Donc vous, vous voulez transformer du BBcode en HTML et vous n'utilisez pas les regex ? Donc si quelqu'un écrit : [ b ], il aura un <strong> qui arrivera. Mais s'il oublit de mettre un [/ b ] il se passera quoi au niveau du code XHTML ? Il sera invalide.

D'ou, la solution (utililsé sur mon parseur personnel) :
CODE
<?php
$txt = ' Texte ordinaire [b]Texte en gras[/b] Ordinaire';
$txt = preg_replace('#\[b\](.+)\[/b\]#','<strong>\1</strong>',$txt);
echo $txt;
?>


Je n'ai pas testé le code source (je viens de l'écrire de tête), merci de dire s'il marche ou s'il y a des bugs avec un texte du style : 

Euh, oui, c'est ça....
Ta solution est interessante, mais un
CODE
[b]
tout seul (en cas d'oubli de la balise fermante), ben ça le fait pas :nono:
Il faudrait une solution qui ferme toutes les balises ouvertes.
CODE
(Par exemple, si [b] dans le code, mais pas [/b], le script rajoute [/b] à la fin)


De plus, voici le code (dasn mon script) qui affiche le texte de la tribune :
CODE
<? echo '<p class="textribun">'.nl2br(stripslashes($news['texte'])).'</p>'; ?>


Comment adapter ton code source à ce code ?

Merci Country pour la correction wink.gif

Sinon Xethorn, j'avoue que j'aurai du mal à me servir du lien que tu m'as filé. De plus, le code du HTML_BBCodeParser est super long, ai-je besoin d'un script si complexe ?

Merci Anonymus, mais si le truc de Xethorn marche, je pense que je vais me tourner vers cette solution whistling.gif wink.gif

Merci beaucoup, excusez mes questions de Newbie, mais le Php et moi, on est pas copains copains rolleyes.gif

++

Loupilo
Country
CITATION(Xethorn @ samedi 08 mai 2004, 08:38)
Surtout pas ! Après tu ne sauras pas où tu as fait l'erreur, le mieux ne serait pas de les supprimer mais plus de les mettre en couleur smile.gif

Donc si je te suis il faudrai que le visiteur ré-édite son message pour réctifier sa.

Moi je supprimait les erreurs, de cette façon il se retrouve avec un message propre au final.

On peut aussi utiliser un alert() en javascript lors de la soumission du message qui informe le visiteur que toutes les balises ne sont pas fermées.

Tu peut adapter le code de cette façon loupio:
CODE
<?
$news['texte'] = preg_replace("/\[b\](.+?)\[\/b\]/", "<b>$1</b>", $news['texte']);
echo '<p class="textribun">'.nl2br(stripslashes($news['texte'])).'</p>';
?>
Xethorn
CITATION
tout seul (en cas d'oubli de la balise fermante), ben ça le fait pas

C'est fait pour ... si on oublit un morceau le reste ne passe pas, d'ailleurs, en parlant de ça, il faut aussi sécuriser le bbcode si tu utilises des classes.
Loupilo
CITATION(Country @ samedi 08 mai 2004, 10:45)
Donc si je te suis il faudrai que le visiteur ré-édite son message pour réctifier sa.

Moi je supprimait les erreurs, de cette façon il se retrouve avec un message propre au final.

On peut aussi utiliser un alert() en javascript lors de la soumission du message qui informe le visiteur que toutes les balises ne sont pas fermées.

Tu peut adapter le code de cette façon loupio:
CODE
<?
$news['texte'] = preg_replace("/\[b\](.+?)\[\/b\]/", "<b>$1</b>", $news['texte']);
echo '<p class="textribun">'.nl2br(stripslashes($news['texte'])).'</p>';
?>

Seulement, le visiteur n'est pas inscrit et ne peut pas éditer ses messages biggrin.gif
Merci pour le code wink.gif

Xethorn, je ne comprends pas le coup des classes blink.gif

Sinon, un script qui ferme les balises ouvertes est-il possible ? Ce serait pratique ça tongue.gif
Je regarde sur le Hub...

[B]Merci à tous wink.gif

++

Edit: comme vous le voyez, la balise [b] n'est pas prise en compte, elle est ignorée...
C'est bizarre...
une fonction existe pour les fermer ?
Xethorn
Non et pour des raisons qui sont évidentes :
On ne doit pas les fermer automatiquement mais les ignorer.
Sinon, on retombe dans le principe de IE, il interprete, renvoi du code, mais qui n'est pas forcement valide. On ne fait que l'ignorer. C'est pour moi la méthode la plus pratique, sinon, tu vas te compliquer avec de nombreuses valeurs à remplacer et à ajouter.
Loupilo
D'accord...
Mais donc dans ta fonction (corrigée par Country), les
CODE
[b]
non fermés ne seront pas remplacés par <strong> ?
Si c'est ça, c'est très bien smile.gif

Merci wink.gif
Country
En fait sa réagira comme le forum ici, cad qu'il ne seront pas remplacé.
Loupilo
Bon, j'ai testé, ça marche happy.gif
Tout est remplacé, et une balise seule ne l'est pas.
Merci beaucoup !
je suis encore intrigué par la sécurité et les classe de Xethorn tongue.gif

++ wink.gif
Xethorn
Bien, disons que tu peux avoir des textes preg_replace qui transforment des variables présentent dans le code php et l'affiche dans le resultat :
exemple :

- texte tappé : 'Ton texte $verbe pas terrible'
- dans ton code php, on imagine que tu as une variable $verbe = 'est'

avec un preg_replace("#tontruc#e',"$this->fonction('\1')",$txt), tu pourrais avoir la surprise de retrouver ta phrase à la fin : 'Ton texte est pas terrible'. Donc, moi dès le début du script, je remplace les "$" par une valeur aléatoire, idem pour les quotes. ça évite des erreurs smile.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.