Balises échappées via "htmlentities"

Ou comment ne pas échapper une balise

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour tout le monde,

Voici le contexte : Je récupère du texte via un formulaire, puis j'insère ce texte dans une page web. J'utilise la fonction htmlentities pour me protéger d'éventuelles attaques. Toutefois, je souhaite que certaines balises ne soient pas échappées, pour mettre en forme ce même texte ; par exemple, les balises strong.

Je fais donc ceci :

1
2
3
4
5
6
<?php
$pre = htmlentities ($pre, ENT_QUOTES);

$pre = str_replace('&lt;strong&gt;','<strong>', $pre);
$pre = str_replace('&lt;/strong&gt;','</strong>', $pre);
?>

Le problème est que je souhaiterais faire la même chose avec les balises de lien, mais que la balise d'ouverture n'est pas <a> mais <a href "" … >.

Auriez-vous une idée pour que cette balise ne soit pas échappée ?

Merci d'avance pour votre aide !

+0 -0

Cette réponse a aidé l'auteur du sujet

Hello,

Tu pourrais partir sur une expression régulière et preg_replace() :)

1
2
<?php
$pre = preg_replace("#&lt;a href=&quot;(.+)&quot;&gt;(.+)&lt;/a&gt;#", "<a href=\"$1\">$2</a>", $pre);

Mais il existe peut-être une fonction qui te permet de dire directement ce que tu veux parser malgré tout :-/

Je l'ai fait à l'arrache et sans tester, mais c'est l'idée ;)

Édité par Jérôme Deuchnord

A graphical interface is like a joke: if you have to explain it, that's shit. | Les logiciels Deuchnord

+1 -0

Une fonction te le fait directement - sans utiliser de str_replace ni de preg_replace -, il s'agit de strip_tags, dans ton cas, elle fonctionnerais de cette manière - toutefois, je ne sais pas si elle convient précisément à ton cas puisque celle-ci retire les balises HTML et ne les remplace pas par des "&lt;" ou "&gt;" - :

1
2
// Pas de htmlentities avant
$pre = strip_tags($pre, '<strong></strong><a></a>');

« There was a kingdom that was falling so fast that people wouldn't help it, they wouldn't make it last » - Animal Kingdom, Beau

+0 -0
Auteur du sujet

J'ai essayé cette technique auparavant, qui aurait pu en effet convenir, par contre il me semble que si on met un espace dans la balise (par exemple : < strong >) strip_tags ne l'enlève pas …

J'ai aussi essayé les filtres php, qui suppriment bien toutes les balises même avec espaces, par contre on ne peut pas mettre d'exceptions …

+0 -0

Une fonction te le fait directement - sans utiliser de str_replace ni de preg_replace -, il s'agit de strip_tags, dans ton cas, elle fonctionnerais de cette manière - toutefois, je ne sais pas si elle convient précisément à ton cas puisque celle-ci retire les balises HTML et ne les remplace pas par des "&lt;" ou "&gt;" - :

1
2
// Pas de htmlentities avant
$pre = strip_tags($pre, '<strong></strong><a></a>');

Titi_Alone

Cette fonction peut avoir un comportement parfois mal défini en cas de balises "rompues", ce qui entraine plus de merde qu'autre chose…

J'ai essayé cette technique auparavant, qui aurait pu en effet convenir, par contre il me semble que si on met un espace dans la balise (par exemple : < strong >) strip_tags ne l'enlève pas …

Me semble pas qu'une balise puisse commencer par un espace ceci dit…

Édité par Talus

"Meh." Outil de diff PHP : Totem

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte