Как остановить HTML TEXTAREA от декодирования HTML-сущностей

у меня странная проблема:

в базе данных у меня есть буквальный амперсанд lt точка с запятой:

<div  

всякий раз, когда его печатают в тег html textarea, исходный код страницы показывает > as >.

как остановить это декодирование?

6 ответов


в PHP это можно сделать с помощью htmlentities (). Пример ниже.

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

без htmlentities () textarea будет интерпретировать и отображать символ TM ( ™ ) вместо "™".

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


вы не можете остановить декодирование сущностей в textarea[1], так как содержимое textarea не (в отличие от скрипта или элемента стиля) встроенный CDATA, даже если восстановление ошибок может иногда создать впечатление, что это.

определение элемента textarea:

<!ELEMENT TEXTAREA - - (#PCDATA)       -- multi-line text field -->

т. е. он содержит PCDATA, который характеризуется как:

текст документа (обозначается SGML построить "#PCDATA"). Текст может содержать ссылки на символы. Напомним, что они начинаются с & и заканчивается точкой с запятой (например, Herg&eacute;'s adventures of Tintin содержит ссылку на сущность символа для e острый символ).

это означает, что при вводе (недопустимый HTML) "начало тега" (<) браузер исправляет его на "меньше" (&lt;) но когда вы вводите "начало сущности" (&), которая is разрешено, исправление ошибок не требуется место.

вам нужно написать, что вы имеете в виду. Если вы хотите включить некоторые HTML в качестве данных, вы должны преобразовать любой символ со специальным значением в соответствующую ссылку на символ.

если данные:

&lt;div

тогда HTML должен быть:

<textarea>&amp;lt;div</textarea>

вы можете использовать стандартные функции для преобразования (например, в PHP htmlspecialchars или Perl HTML:: Entities module).

NB 1: Если бы Вы были используя XHTML[2] (и действительно используя его,это не считается, если вы служите ему как text / html) тогда вы можете использовать явный блок CDATA:

<textarea><![CDATA[&lt;div]]></textarea>

NB 2: или если браузеры реализовали HTML 4 Правильно


хорошо, но вопрос в том . почему он их расшифровывает ? предполагая, что я добавил &, сохраните textarea, ti будет сохранен

  • на сервер отправляет (в браузер) данные, закодированные как HTML-код.
  • на обозреватель отправляет (на сервер) данные, закодированные как application / x-www-form-urlencoded (или multipart/form-data).

поскольку браузер не отправляет данные в виде HTML, символы не представлены в виде HTML сущности.

если вы берете данные, полученные от клиента, а затем помещаете их в HTML-документ, то сначала вы должны закодировать его как HTML.


вы должны быть уверены, что это отображается в обозревателе:

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

по сути, это означает, что & на &lt; должен быть HTML закодирован в &amp;. Как это сделать, будет зависеть от технологий, которые вы используете.

обновление: подумайте об этом так. Если вы хотите дисплей <div> внутри textarea вам придется кодировать <> иначе <div> будет обычным HTML-элементом для браузер:

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

сказав это, если вы хотите дисплей &lt;div&gt; внутри textarea вам придется кодировать & снова, потому что браузер декодирует HTML-объекты при рендеринге HTML. Это не имеет ничего общего с базой данных.


У меня была такая же проблема и я просто сделал две замены на текст из базы данных, прежде чем впустить его в текстовое поле:

myString = Replace(myString, "&", "&amp;")
myString = Replace(myString, "<", "&lt;")

заменить n: o 1, чтобы обмануть textarea, чтобы показать коды. заменить n: o 2: Без этой замены вы не можете показать слово "" внутри textarea (это закончится тегом textarea).

(код Asp / vbscript выше, перевести на метод замены по вашему выбору языка)


вы можете обслуживать свой DB-контент с отдельной страницы, а затем разместить его в текстовом поле с помощью JavaScript (jQuery) Ajax-call:

request = $.ajax
({  
    type: "GET",
    url: "url-with-the-troubled-content.php",           
    success: function(data)
    {
        document.getElementById('id-of-text-area').value = data;    
    }
}); 

объяснил

http://www.endtask.net/how-to-prevent-a-textarea-element-from-decoding-html-entities/


Я нашел альтернативное решение для чтения и работы с in-browser, просто прочитайте текст элемента () с помощью jQuery, он возвращает символы в качестве символов отображения и позволяет мне писать из textarea в innerHTML div, используя свойство через html ()...