it-swarm.com.ru

Как остановить HTML TEXTAREA от декодирования HTML объектов

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

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

<div  

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

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

21
Ronan Dejhero

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

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

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

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

17
Chris Hubbard

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

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

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

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

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

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

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

Если данные:

&lt;div

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

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

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

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

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

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


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

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

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

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

36
Quentin

Вы можете обслуживать ваш 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
Victor

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

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

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

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

1
Andreas Jansson

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

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

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

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

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

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

1
Lukas Eder

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

0
Lewis Richard Phillip Cowles