Bonsoir tout le monde, J'ai suivit le tuto pour mettre du BBcode sur son site, tout vas bien :) (le bbcode sert pour l'ajout de news) Cependant lorsque je veux modifier une news, il y un problème que je n'arrive à résoudre... Le textarea recupère le texte en html, mais pas en BBcode ... Il faudrait que j'arrive à faire le principe du tuto en sens inverse mais je n'y arrive pas :/ Le code de base était: [code] $description = htmlentities($description, ENT_NOQUOTES,'UTF-8'); $conv = array( '[b](.*?)[\/b]' => '$1', '[i](.*?)[\/i]' => '$1', '[u](.*?)[\/u]' => '<u>$1</u>', '[img](.*?)[\/img]' => ' ', '[url=([^]]*)](.*)[\/url]' => ' $2' ); foreach ($conv as $key => $v) { $description = preg_replace('/'.$key.'/',$v , $description); }[/code] Ce que j'ai essayé: [code] $description = htmlentities($data['description']); $conv = array( '(.*?)' => '[b]$1[\/b]' , '(.*?)' => '[i]$1[\/i]', '<u>(.?)$1</u>' => '[u][\/u]', ' ![]((.?))' => '[img]$1[\/img]', ' (.*)' => '[url=$1]$2[\/url]' ); foreach ($conv as $key => $v) { $description = preg_replace('/'.$key.'/', $v ,$description); }[/code] 4 messages d'erreurs apparaissent: Warning: preg_replace() [function.preg-replace]: Unknown modifier 'p' in C:\wamp\www\agence\admin\pages\offre-location.php on line 71 Warning: preg_replace() [function.preg-replace]: Unknown modifier 'p' in C:\wamp\www\agence\admin\pages\offre-location.php on line 71 Warning: preg_replace() [function.preg-replace]: Unknown modifier '>' in C:\wamp\www\agence\admin\pages\offre-location.php on line 71 Warning: preg_replace() [function.preg-replace]: Unknown modifier '>' in C:\wamp\www\agence\admin\pages\offre-location.php on line 71 Warning: preg_replace() [function.preg-replace]: Unknown modifier 'a' in C:\wamp\www\agence\admin\pages\offre-location.php on line 71 ligne 71: $description = preg_replace('/'.$key.'/', $v ,$description); Dans le textarea j'ai mis un print_r($conv) qui me donne ceci: [code]Array ( [(.*?)] => [b]$1[\/b] [(.*?)] => [i]$1[\/i] [<u>(.?)$1</u>] => [u][\/u] [![]((.?))] => [img]$1[\/img] [(.*)] => [url=$1]$2[\/url] )[/code] Pouvez vous m'aider svp ?
Je vais tenter de te présenter la chose sous un autre angle. Ce que tu fais actuellement c'est : Lors de la création : - 1) Ecrire ta news avec du BBCode - 2) Transformer le BBCode en html - 3) L'enregistrer dans ta base de donnée** Lors de l'affichage sur ton site : - 1) Récupérer le contenu de ta bdd - 2) Afficher tel quel.** Donc quand tu récupère la news depuis ta base de donnée elle est en html et non en BBCode, ce qui n'est pas pratique pour l'éditez. Ce que je te conseille c'est de : Lors de la création : - 1) Ecrire ta news avec du BBCode - 2) L'enregistrer dans ta base de donnée** Lors de l'affichage sur ton site : - 1) Récupérer le contenu de ta bdd - 2) Transformer le BBCode en html - 3) Affiche le résultat** Voilà ce que je ferais dans ton code : Dans ta page qui affiche les news aux utilisateur, nommons la news.php, tu y ajoute la fonction suivante : [code] function bbcode($news){ $description = htmlentities($news, ENT_NOQUOTES,'UTF-8'); $conv = array( '[b](.*?)[\/b]' => '$1', '[i](.*?)[\/i]' => '$1', '[u](.*?)[\/u]' => '<u>$1</u>', '[img](.*?)[\/img]' => ' ', '[url=([^]]*)](.*)[\/url]' => ' $2' ); foreach ($conv as $key => $v) { $description = preg_replace('/'.$key.'/',$v , $description); } return nl2br($description); }[/code] et lorsque tu dois afficher ta news à l'écran, plutôt que de faire [code]echo $description;[/code] tu fais [code]echo bbcode($description);[/code] Comme ça toi tu garde tes news en format BBCode pour ton édition de news, etc.. et l'utilisateur qui lit tes news lui les voit en format html. Voilà, en espérant que c'est plus clair.
Salut,
alors ta conversion ne peut pas fonctionner car htmlentities ne te renvoie pas < > pour tes chevrons mais < et > donc ton preg_replace ne pourra pas fonctionner.
L'erreur t'est donnée car tu utilises le caractère '/' comme marqueur de début et de fin de chaine. Hors ce caractère est utilisé pour les balises <p>< / p> donc du coup il se perd dans ta regexp.
Tu as deux solutions :
1) Echapper de ta regexp tous les caractères dangereux ( /._] etc) en leur ajoutant un \ devant (ex : / devient \/).
2) Utiliser un autre marqueur de regexp (n'importe lequel mais que ne puisse pas être dans ta regexp
Normalement si tu mets quelque chose comme ceci, tu ne devrais plus avoir d'erreur :
$description = preg_replace('^'.$key.'^', $v ,$description);
Ensuite je te conseille de regarder le résultat de $description afin de voir comment le code HTML est rendu. Cela te permettra de faire la bonne regexp dans $conv.
Bonsoir, Tout d'abord, un énorme merci pour t'être prêté à mon problème. J'ai suivit ton conseil et j'ai remplacé '/' par '^' ce qui a enlever 4 messages d'erreurs ^^ Cependant il en reste un et je n'arrive pas à le supprimer. Lorsque je souhaite echo $descripiton, rien ne s'affiche (surement à cause de l'erreur restante) L'erreur est la suivante: - Warning: preg_replace() [function.preg-replace]: Unknown modifier '\' in C:\wamp\www\agence\admin\pages\offre-location.php on line 71 En sachant que la ligne 71 c'est: [code]$description = preg_replace('^'.$key.'^', $v ,$description);[/code] Je ne comprend pas le problème d'antislash :/ Peux-tu m'éclairer ? Merci d'avance.
Je pense que le problème vient du fait que tu utilises un antislash dans $description et que du coup preg_replace ne comprend pas. En effet \ est utilisé pour échapper les caractères. Si tu as un antislash dans $description, il faut l'échapper lui aussi ('\' doit devenir '\').
Peux tu envoyer le résultat de $description avant de faire un preg_replace() ?
Merci encore de m'aider !
Si je fait un echo de $description avant le preg_match, j'ai ceci: <span style="font-weight: bold;">azer</span> <u>azer</u>
Comment est-ce que je peut régler le soucis d'antislash selon toi ? Je ne vois pas comment faire ....
Merci d'avance :)
Voici comment je te conseillerais de faire : Utilise ton bbcode à l'affichage, et non à l'encodage. Lorsque tu ajoute une news, ne fais pas un htmlentities, ni ton foreach. Et tu l'ajoute tel quel (avec le bbcode) à ton systéme de sauvegarde (fichiers, base de données, ou autre). Ensuite, lorsque tu veux afficher ta news à l'écran, tu utilise ton foreach pour traduire le bbcode en html. Ex : Tu crée ta news dans la page add_news.php, et tu l'affiche sur index.php. Idéalement tu devrais utilisé ton foreach sur index.php et non sur add_news.php. Donc c'est lorsque tu veux afficher une news à l'écran tu devra faire : [code] $description = htmlentities($description, ENT_NOQUOTES,'UTF-8'); $conv = array( '[b](.*?)[\/b]' => '$1', '[i](.*?)[\/i]' => '$1', '[u](.*?)[\/u]' => '<u>$1</u>', '[img](.*?)[\/img]' => ' ', '[url=([^]]*)](.*)[\/url]' => ' $2' ); foreach ($conv as $key => $v) { $description = preg_replace('/'.$key.'/',$v , $description); } echo nl2br($description); [/code] Si ce n'est pas clair, dit le moi je tenterais de mieux expliquer !
Bonjour, je te remercie de m'aider ! Si j'ai bien compris, tu me conseillerai de créer un fichier que je nommerai news.php par exemple, où il y aurait quelque chose que cela: [code] // CONNECTION BDD etc... $description = htmlentities($description, ENT_NOQUOTES,'UTF-8'); $conv = array( '[b](.*?)[\/b]' => '$1', '[i](.*?)[\/i]' => '$1', '[u](.*?)[\/u]' => '<u>$1</u>', '[img](.*?)[\/img]' => ' ', '[url=([^]]*)](.*)[\/url]' => ' $2' ); foreach ($conv as $key => $v) { $description = preg_replace('/'.$key.'/',$v , $description); } echo nl2br($description);[/code] et dans ma page d'admin, je ferais un include de ce fichier ? J'avoue ne pas comprendre à 100%, je ne gère pas a fond vraiment encore le php (du moins à réaliser des algorithmes correctes, j'ai quand même une certaine compréhension) Merci d'avance :)
Tout simplement en effet !
Prendre le problème à l'inverse, je m'en veux de ne pas y avoir pensé ... Je te remercie 1000 fois en tout cas pour ton aide qui m'est bien précieux !
Tout marche correctement après ces modifications !
Merci encore ! :)