web-dev-qa-db-fra.com

Comment arrêter un html TEXTAREA de décoder des entités html

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?

21
Ronan Dejhero

En PHP, cela peut être fait en utilisant htmlentities (). Exemple ci-dessous.

<?php
  $content = "This string contains the TM symbol: &trade;";
  print "<textarea>". htmlentities($content) ."</textarea>";
?>

Sans htmlentities (), la zone de texte interpréterait et afficherait le symbole TM (™) au lieu de "& trade;".

http://php.net/manual/en/function.htmlentities.php

17
Chris Hubbard

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&eacute;'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" (&lt;), 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:

&lt;div

Alors le HTML doit être:

<textarea>&amp;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[&lt;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?

  • Le serveur envoie (au navigateur) des données codées comme HTML .
  • Le navigateur envoie (au serveur) des données codées sous la forme application/x-www-form-urlencoded (ou multipart/form-data).

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

36
Quentin

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/

1
Victor

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, "&", "&amp;")
myString = Replace(myString, "<", "&lt;")

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)

1
Andreas Jansson

Vous devez être sûr que cela est rendu au navigateur:

<textarea name="somename">&amp;lt;div</textarea>

En gros, cela signifie que le & dans &lt; doit être encodé en HTML avec &amp;. 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">&lt;div&gt;</textarea>

Cela dit, si vous voulez afficher&lt;div&gt; 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.

1
Lukas Eder

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 () ...