Bonjour,

Bonjour je viens vers vous car je cherheche une solution pour pouvoir générer du contenu html dynamiquement à partir de donnés enregistré dans une base.

Sauf que voila, je souhaite mettre des div span à certains endroits de mon texte pour pouvoir styliser mon affichage.

Un exemple simple :

Avec une terme Manger, je vouvrais faire apparaitre le suffix ER en rouge et le reste noir par defaut.

Le soucis c'est que j'ai lu à plusieurs reprise que le stocké du code html dans la BDD est très dangereux.

Alors comment je peux y remédier à ce problème ?

12 réponses


Lartak
Réponse acceptée

Bonjour.
Il te suffit simplement de le faire après avoir récupéré les enregistrements de la base de données, tu pourrais par exemple utiliser la fonction preg_replace en lui définissant une regex correspondant à ce que tu cherches et par quoi tu veux le remplacer, exemple :

$string = 'Il faudrait manger tous les jours.';

echo preg_replace('/er/', '<span class="red">er</span>', $string);

Ce qui donne ceci.
Suis le lien et cliques sur le bouton Execute code.

en creant un objet json decrivant la balise par exemple.

Alors je suis vraiment, mais vraiment pas fan de ta solution Lartak car avec ton regex tu match des parties de mot comme aciER ou acquERir qui correspondent pas à ce que Devdeb veut faire.

Le mieux à mon humble avis c'est que tu utilises du markdown et tu modifie le css.

Je m'explique quand tu écris ton texte dans ton interface web tu as juste à écrire Les verbes du premier groupes se termine en **ER** comme; mang**er**, etc...
Ceci à plusieurs avantages:

  • Il existe une multitude de librairie qui parse le markdown pour toi donc pas besoin de réinventer la roux
  • Tu as juste à éditer le css de la balise générer par le markdown avec une simple ligne color: red
  • Tu te casse pas la tête à faire des regex et à les maintenir

Alors je suis vraiment, mais vraiment pas fan de ta solution Lartak car avec ton regex tu match des parties de mot comme aciER ou acquERir qui correspondent pas à ce que Devdeb veut faire.

Je n'ai fait que lui proposer un exemple d'une des nombreuses solutions, il lui suffit juste d'adapter pour que ça corresponde à ses attentes et à son système, ou de trouver parmis les nombreuses fonctions de PHP, ce qui lui correspondrait le mieux.
Ta solution n'est pas vraiment adapté pour autant, car c'est en gros l'équivalent d'ajoutetr du HTML en base de données, ce qu'il veut éviter.
De plus que ce que tu lui propose, entourer une chaîne de caractères par **, c'est l'équivalent en HTML de la balise strong, par conséquent ce que tu lui proposes, c'est qu'en css il modifie le rendu de toutes les balises strong, ce qui me paraît être une des solution des moins logiques.
Surtout que si par exemple il ne veut faire son système que dans un cas particulier, ta solution va lui poser des problèmes pour tout le reste de son site, car il va se retrouver avec des textes qui contiendront des astérisques et qui n'auront aucun sens.

Mais en quoi j'ajoute de l'HTML dans la base de donnée ? Tu parse le markdown et le filtre lors du rendu tu n'enregistre pas l'HTML dans la BDD.
Aussi d'où je dis qu'il doit modifier le rendu de toute les balises strong ? Suffit d'entourer le texte d'une div avec une classe comme explication et tu sélectionnes que les .explications strong.

Aussi tu lui propose la solution la plus bourrins à laquelle je peux penser et puis je pense pas qu'il veut faire de ce système un cas particulier.

Je n'ai pas dit qu'avec ta solution ça ajoutait du HTML en base de données, mais que c'est tout comme, puisque tu insères du contenu en base de données qui va influencer le rendu HTML.

je pense pas qu'il veut faire de ce système un cas particulier.

Vu l'exemple qu'il donne, ça fait penser à un exercice de conjuguaison, et s'il veut utiliser le même champ, pour la question et la réponse du correctif, exemple :

Énoncé

Dans la phrase suivante entourez l'infinitif du verbe :

  • Il faudrait manger tous les jours.

Correctif

  • Il faudrait manger tous les jours.

Donc avec ta proposition, il va se retrouver restreint car il devra créer un champ supplémentaire inutile.
Personnellement, je ne vois pas en quoi ma méthode serait plus bourrine que la tienne.

Alors juste pour qu'on soit clair, comment tu crois que les commentaires sur ce forum sont stocker ? On est d'accord qu'on écris avec du Markdown qui est lui aussi stocker dans la base de donnée alors s'il te plait arrête de dire que c'est "mauvais" vu que clairement tu utilises un site qui fait exactement ça. Ce qui est mauvais c'est de ne pas FILTRER le rendu et qui lui peut ensuite laisser la porte ouverte à des failles XSS.
Je suis d'accord que tu veux limiter un maximum d'avoir du contenu qui peut afficher de l'HTML dans ta base de donnée mais ce n'est pas
mauvais en soit.

Donc maintenant que j'ai dit ça revenons à la question initiale.
Dans sont post originale il veut, je cite, je souhaite mettre des div span à certains endroits de mon texte pour pouvoir styliser mon affichage. ça ne le dérange pas du tout de rajouter un champt/div "inutile" vu que c'est EXACTEMENT ce qu'il veut faire.

De plus permet moi de te montrer un contre exemple:

Énoncé

Dans la phrase suivante entourez les infinitif des verbes du premier groupe :

  • Vous pourriez échanger une partie de votre acier contre du plastic pour vous diversifier.

Avec ta solution avec les expressions régulières tu auras les mots échanger, acier et diversifier qui vont se mettre en gras/rouge ou quelconque.
Alors certe tu peux dire de ne pas utiliser des mots qui conflit avec ça mais dans ce cas là le code n'est pas adapter au problème.

De plus tu dis que tu ne propose qu'une solution parmis tant d'autres ce qui est le cas mais je pense que si qqun vient poser une question du genre il cherche une réponse plus ou moins direct à son problème et pas un ah tiens voici une idée qui n'est peut être pas adapter à ton cas mais sinon tu peux fouiller la doc de PHP pour trouver ton bonheur.

Je n'ai jamais dit que c'est mauvais et je connais très bien le Markdown, sauf que là ça n'a rien à voir.

ça ne le dérange pas du tout de rajouter un champt/div "inutile" vu que c'est EXACTEMENT ce qu'il veut faire.

Si c'est ce qu'il voulait faire, il n'aurait pas eu besoin de venir demander de l'aide sur le forum, si c'est juste pour créer un champ supplémentaire en base de données.
Pour rappel :

Sauf que voila, je souhaite mettre des div span à certains endroits de mon texte pour pouvoir styliser mon affichage.

Mais il ne dit pas que c'est en base de données, mais uniquement au niveau de l'affichage, donc ton propos est totalement inexact.

Avec ta solution avec les expressions régulières tu auras les mots échanger, acier et diversifier qui vont se mettre en gras/rouge ou quelconque.

Tu es vraiment borné ma parole, j'ai dit que c'est simplement un exemple, je ne connais pas le contenu de sa base de données pour pouvoir lui proposer une solution exacte à son système, par ailleurs, le forum n'est pas prévu à la base pour donner forcément la solution exacte, mais plutôt pour débloquer l'auteur du sujet ou tout du moins lui donner des pistes et je ne pense pas en être loin.

tiens voici une idée qui n'est peut être pas adapter à ton cas mais sinon tu peux fouiller la doc de PHP pour trouver ton bonheur.

Je ne pense pas avoir dit quelque chose du genre et ce que je lui propose est quand même ciblé sur un type de fonction PHP, qui est celui concernant les manipulations sur les chaînes de caractères.
Sinon je pourrais très bien donner ce type d'exemple :

$string = "Vous pourriez échang`er` une partie de votre acier contre du plastic pour vous diversifi`er`.";
$string = preg_replace('/`er`|`ir`/', '<span class="red">$0</span>', $string);
echo str_replace('`', '', $string);

La différence avec ce que tu proposes, c'est qu'il n'a aucune librairie à ajouter, et que même dans le cas où il oubli de supprimer les backtick de la chaîne de caractères, ça n'aura pas un gros impact sur l'affichage du texte.

Au pire il peut le faire avec des éléments du markdown sans lib pour des choses simple. Pas besoin de sortir l'artillerie lourdre.
Surtout que ta solution @Lartak reviendrais à faire en markdown un **mot** et que on peut largement l'améliorer :

$str = "Vous pourriez échang**er** une partie de votre acier contre du plastic pour vous diversifi**er**.";
$str = preg_replace('/\*\*(.+?)\*\*/i', '<strong>$1</strong>', $str);
echo $str;

Donc au final vous proposer tous les 2 la même solution, sauf que celle de @Gorgio est plus généraliste et plus pratique et peut très bien être fait sans lib.

Surtout que ta solution @Lartak reviendrais à faire en markdown ...
Donc au final vous proposer tous les 2 la même solution

Absolument pas, tu ne sembles pas avoir bien lu ni ce que veux obtenir l'auteur dans son sujet, ni l'intégralité des réponses.
Pour la première partie, l'auteur ne cherches pas a mettre une chaîne de caractère en gras, soit avec la balise strong, donc ton code est incorrect.
Pour la seconde partie, si dans ma dernière proposition j'utilise les backtick c'est pour premièrement car avec une expression régulière il est impossible de différencier un infinitif d'un verbe d'un autre mot et deuxièmement pour éviter que si l'auteur oublie de retirer les backtick après l'utilisation de la fonction preg_replace, que ça ait un gros impact au niveau de l'affichage.
Donc nos solutions ne sont en aucun cas les mêmes, la seule chose qui peut être semblable, c'est l'utilisation d'un caractère spécifique qui entoure une partie de la chaîne de caractères qui devra être détecté, un genre de wildcard en quelques sortes.

Devdeb22
Auteur

holaaa ça m'a l'ère bien compliqué tous ça. Je crois que ce que je vais faire c'est d'entourer ma chaine de caractère de de mots clés et ensuiste dans le php utiliser une fonction preg_replace c'est mieux comme ça.

Le temps pour moi d'apprendre et d'intégrer d'autres solutions plus optimales

En effet fait au plus simple si pour l'instant tu n'a pas encore les compétences pour faire mieux. Tu le fera un autre moment quand tu sera plus à l'aise.