Как остановить HTML TEXTAREA от декодирования HTML объектов - PullRequest
21 голосов
/ 15 декабря 2011

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

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

<div  

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

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

Ответы [ 6 ]

36 голосов
/ 15 декабря 2011

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

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

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

т.е. он содержит PCDATA, который описывается как :

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

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

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

Если данные:

&lt;div

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

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

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

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

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

Примечание 2. Или, если браузеры правильно реализовали HTML 4


Хорошо, но вопрос в том. почему он их все равно декодирует? при условии, что я добавил &, сохраните текстовую область, ti будет сохранен & lt; , но отображается как <, сохранение его снова преобразует его обратно в <(но оно останется <в базе данных), сохранение снова сохранит его <в базе данных, почему текстовая область его декодирует? </p>

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

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

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

18 голосов
/ 14 сентября 2013

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

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

Без htmlentities () текстовая область будет интерпретировать и отображать символ ТМ (& trade;) вместо «& trade;».

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

1 голос
/ 29 июня 2015

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

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/

1 голос
/ 13 сентября 2013

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

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

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

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

1 голос
/ 15 декабря 2011

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

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

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

ОБНОВЛЕНИЕ : Подумайте об этом так.Если вы хотите отобразить <div> внутри текстовой области, вам придется кодировать <>, потому что в противном случае <div> будет обычным элементом HTML для браузера:

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

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

0 голосов
/ 26 февраля 2014

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

...