У меня странная проблема:
В базе данных у меня есть буквальная точка с символом ampersand lt:
<div
всякий раз, когда он печатается в тег html textarea, исходный код страницы показывает >
как >
.
Как остановить это декодирование?
У меня странная проблема:
В базе данных у меня есть буквальная точка с символом ampersand lt:
<div
всякий раз, когда он печатается в тег html textarea, исходный код страницы показывает >
как >
.
Как остановить это декодирование?
В PHP это можно сделать с помощью htmlentities(). Пример ниже.
<?php
$content = "This string contains the TM symbol: ™";
print "<textarea>". htmlentities($content) ."</textarea>";
?>
Без htmlentities() текстовая область будет интерпретировать и отображать символ TM (& trade;) вместо "& trade;".
Вы не можете останавливать объекты, декодированные в текстовом поле [1], поскольку содержимое текстового поля не (в отличие от элемента script или стиля) встроенного CDATA, хотя восстановление ошибок может иногда создается впечатление, что это так.
Определение элемента textarea:
<!ELEMENT TEXTAREA - - (#PCDATA) -- multi-line text field -->
то есть. он содержит PCDATA, который описывается как:
Текст документа (обозначается конструкцией SGML "#PCDATA" ). Текст может содержать ссылки на символы. Напомним, что они начинаются с
&
и заканчиваются точкой с запятой (например,Hergé adventures of Tintin
содержит ссылку на объект символа для острого символа).
Это означает, что при вводе (недействительный HTML) "начала тега" (<
) браузер исправляет его до "меньше, чем знак" (<
), но когда вы вводите "начало объекта" ( &
), который разрешен , коррекция ошибок не выполняется.
Вам нужно написать, что вы имеете в виду. Если вы хотите включить некоторый HTML в качестве данных, тогда вы должны преобразовать любой символ со специальным значением в соответствующую ссылку на символ.
Если данные:
<div
Затем HTML должен быть:
<textarea>&lt;div</textarea>
Вы можете использовать стандартные функции для его преобразования (например, PHP htmlspecialchars
или Perl HTML:: Entities module).
NB 1: Если вы использовали XHTML [2] (и действительно используете его, он не учитывается, если вы его используете как text/html), вы можете использовать явный блок CDATA:
<textarea><![CDATA[<div]]></textarea>
NB 2: Если браузеры правильно реализовали HTML 4
Хорошо, но вопрос в том. почему он все равно их декодирует? предполагая, что я добавил, и, сохраняя текстовое поле, ti будет сохранено & lt; lt;, но отображается как <, сохранение его снова преобразует его обратно в < (но он останется < в базе данных), сохранение снова сохранит его < в базе данных, почему textarea его декодирует?
Поскольку браузер не отправляет данные в формате HTML, символы не представлены как объекты HTML.
Если вы берете данные, полученные от клиента, а затем помещаете их в HTML-документ, вы должны сначала закодировать его как HTML.
Вы должны быть уверены, что это отображается в браузере:
<textarea name="somename">&lt;div</textarea>
По существу, это означает, что &
в <
должен быть закодирован html до &
. Как это сделать будет зависеть от технологий, которые вы используете.
ОБНОВЛЕНИЕ. Думайте об этом так. Если вы хотите отобразить <div>
внутри текстового поля, вам нужно будет закодировать <>
, потому что иначе <div>
будет обычным элементом HTML в браузере:
<textarea name="somename"><div></textarea>
Сказав это, если вы хотите отобразить <div>
внутри текстового поля, вам придется снова закодировать &
, потому что браузер декодирует объекты HTML при рендеринге HTML. Это не имеет ничего общего с вашей базой данных.
Вы можете обслуживать свой 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/
У меня была такая же проблема, и я просто сделал две замены в тексте, чтобы показать из базы данных, прежде чем вставлять ее в текстовую область:
myString = Replace(myString, "&", "&")
myString = Replace(myString, "<", "<")
Замените n: o 1, чтобы обмануть текстовое поле, чтобы показать коды. замените n: o 2: Без этой замены вы не можете показать слово "" внутри текстового поля (оно закончило бы тег textarea).
(код Asp/vbscript выше, переведите на метод замены вашего языка)
Я нашел альтернативное решение для чтения и работы с браузером, просто прочитал текст элемента() с помощью jQuery, он возвращает символы в качестве отображаемых символов и позволяет мне писать из текстового поля в div innerHTML, используя свойство через html()...