Подтвердить что ты не робот

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

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

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

<div  

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

Вам нужно написать, что вы имеете в виду. Если вы хотите включить некоторый 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


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

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

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

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

Ответ 3

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

<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. Это не имеет ничего общего с вашей базой данных.

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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