Aller au contenu

Sujets conseillés

Posté

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

[b] par <strong>, [/b] par </strong>, etc. ...

Est déjà inclu dans le script une fonction pour les smileys :

$news['texte']=eregi_replace(':\)','<img src="images/content.gif" align="middle" border="0" alt=":\)" />', $news['texte']);

Seulement

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

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

Et pour que

 </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

mes [b] et [/b]

:D

Ca me desespere....

Merci de votre précieuse aide ;)

++

Posté

Pour cela tu peut utiliser str_replace()

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

et pareil avec et </strong> ;)

Posté

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 :

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

Anonymus.

Posté
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 :

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

Anonymus.

Donc je devrais faire :

$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:

++ ;)

Posté

Euh.. non, justement :D

$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.

Posté

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 ;)

Posté

Et bien seule la solution de country marche...

C'est sur que le code est plus long, mais ça fonctionne :P

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

merci beaucoup ;)

++

Posté

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

ou alors.. n'aurais tu pas remplacé les variables ? :D

Essaie ceci :

$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.

Posté (modifié)

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) :

<?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 :

Texte ordinaire [ b ]Texte en gras[/ b ] Ordinaire [ b ]Texte en gras[/ b ]
Modifié par Xethorn
Posté

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é:

<?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 ;)

Posté

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 :)

Posté
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) :

<?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

[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.

(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 :

<? echo '<p class="textribun">'.nl2br(stripslashes($news['texte'])).'</p>'; ?>

Comment adapter ton code source à ce code ?

Merci Country pour la correction ;)

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:;)

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

++

Loupilo

Posté
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 :)

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:

<?
$news['texte'] = preg_replace("/\[b\](.+?)\[\/b\]/", "<b>$1</b>", $news['texte']);
echo '<p class="textribun">'.nl2br(stripslashes($news['texte'])).'</p>';
?>

Posté
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.

Posté (modifié)
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:

<?
$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 :D

Merci pour le code ;)

Xethorn, je ne comprends pas le coup des classes :blink:

Sinon, un script qui ferme les balises ouvertes est-il possible ? Ce serait pratique ça :P

Je regarde sur le Hub...

Merci à tous ;)

++

Edit: comme vous le voyez, la balise n'est pas prise en compte, elle est ignorée...

C'est bizarre...

une fonction existe pour les fermer ?

Modifié par loupilo
Posté

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.

Posté

D'accord...

Mais donc dans ta fonction (corrigée par Country), les

[b]

non fermés ne seront pas remplacés par <strong> ?

Si c'est ça, c'est très bien :)

Merci ;)

Posté

Bon, j'ai testé, ça marche ^^

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 :P

++ ;)

Posté

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 :)

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...