J'ai un étrange problème:
Dans la base de données, j'ai un esperluette littérale lt point-virgule:
<div
chaque fois qu'il est imprimé dans une balise HTML textarea, le code source de la page affiche le >
sous la forme >
.
Comment puis-je arrêter ce décodage?
En PHP, cela peut être fait en utilisant htmlentities (). Exemple ci-dessous.
<?php
$content = "This string contains the TM symbol: ™";
print "<textarea>". htmlentities($content) ."</textarea>";
?>
Sans htmlentities (), la zone de texte interpréterait et afficherait le symbole TM (™) au lieu de "& trade;".
Vous ne pouvez pas empêcher les entités d'être décodées dans une textarea [1] car le contenu d'une textarea est pas (contrairement à un élément de script ou de style) intrinsèque CDATA , même si une reprise sur erreur peut parfois donner l’impression que c’est le cas.
La définition de l'élément textarea est:
<!ELEMENT TEXTAREA - - (#PCDATA) -- multi-line text field -->
c'est-à-dire qu'il contient PCDATA qui est décrit comme :
Texte du document (indiqué par la construction SGML "#PCDATA"). Le texte peut contenir des références de caractères. Rappelez-vous que ceux-ci commencent par
&
et se terminent par un point-virgule (par exemple,Hergé's adventures of Tintin
contient la référence de l'entité de caractère pour le caractère e ).
Cela signifie que lorsque vous tapez (le code HTML invalide de) "début de balise" (<
), le navigateur le corrige en "signe inférieur au signe" (<
), mais lorsque vous tapez "début d'entité". (&
), qui est autorisé, aucune correction d'erreur ne se produit.
Vous devez écrire ce que vous voulez dire. Si vous souhaitez inclure du HTML en tant que données, vous devez convertir tout caractère ayant une signification particulière en référence de caractère respective.
Si les données sont:
<div
Alors le HTML doit être:
<textarea>&lt;div</textarea>
Vous pouvez utiliser les fonctions standard pour convertir cela (par exemple, le htmlspecialchars
de PHP ou le module HTML :: Entities de Perl).
NB 1: Si vous utilisiez XHTML [2] (et que vous l’utilisez vraiment, , cela ne compte pas si vous le transmettez sous la forme text/html ), puis vous pouvez utiliser un bloc CDATA explicite:
<textarea><![CDATA[<div]]></textarea>
NB 2: Ou si les navigateurs ont implémenté HTML 4 correctement
Ok, mais la question est. pourquoi il les décode quand même? en supposant que j’ai ajouté, enregistrez la zone de texte, ti sera sauvegardé lt; , mais affiché comme <, le sauvegarder à nouveau le reconvertira en <(mais il restera <dans la base de données), le sauvegarder à nouveau le sauvera <dans la base de données, pourquoi textarea le décode-t-il?
Étant donné que le navigateur n'envoie pas les données au format HTML, les caractères ne sont pas représentés en tant qu'entités HTML.
Si vous prenez les données reçues du client, puis les placez dans un document HTML, vous devez d'abord les encoder au format HTML.
Vous pouvez servir votre contenu de base de données à partir d'une page distincte, puis le placer dans la zone de texte à l'aide d'un appel Javascript (jQuery) Ajax:
request = $.ajax
({
type: "GET",
url: "url-with-the-troubled-content.php",
success: function(data)
{
document.getElementById('id-of-text-area').value = data;
}
});
Expliqué à
http://www.endtask.net/how-to-prevent-a-textarea-element-from-decoding-html-entities/
J'ai eu le même problème et je viens de faire deux remplacements sur le texte pour montrer à partir de la base de données avant de le laisser dans la zone de texte:
myString = Replace(myString, "&", "&")
myString = Replace(myString, "<", "<")
Remplacez n: o 1 pour tromper la textarea afin d'afficher les codes . Replace n: o 2: Sans ce remplacement, vous ne pouvez pas afficher le mot "" dans la textarea (la balise textarea se terminerait).
(Code Asp/vbscript ci-dessus, traduit en une méthode de remplacement de votre choix de langue)
Vous devez être sûr que cela est rendu au navigateur:
<textarea name="somename">&lt;div</textarea>
En gros, cela signifie que le &
dans <
doit être encodé en HTML avec &
. Cela dépend des technologies que vous utilisez.
UPDATE: Pensez-y comme ceci. Si vous voulez afficher<div>
dans une zone de texte, vous devrez encoder <>
car sinon, <div>
serait un élément HTML normal du navigateur:
<textarea name="somename"><div></textarea>
Cela dit, si vous voulez afficher<div>
dans une zone de texte, vous devez à nouveau coder &
, car le navigateur décode les entités HTML lors du rendu du code HTML. Cela n'a rien à voir avec votre base de données.
J'ai trouvé une solution alternative pour lire et utiliser in-browser: il suffit de lire le texte de l'élément () à l'aide de jQuery, il renvoie les caractères sous forme de caractères d'affichage et me permet d'écrire depuis un textarea vers le innerHTML d'un div à l'aide de la propriété via html () ...