我有一个奇怪的问题:
在数据库中,我有一个文字&符号分号:
<div
无论何时将其打印到html textarea标记中,该页面的源代码都会将>
显示为>
。
如何停止此解码?
答案 0 :(得分:36)
你不能停止在textarea [1]中解码的实体,因为textarea的内容不是(不像脚本或样式元素)内在CDATA,即使错误恢复可能有时给人的印象是。
textarea元素的定义是:
<!ELEMENT TEXTAREA - - (#PCDATA) -- multi-line text field -->
即。它包含is described as:
的PCDATA文档文本(由SGML构造“#PCDATA”表示)。文本可能包含字符引用。回想一下,这些以
&
开头,以分号结尾(例如,Hergé's adventures of Tintin
包含 e acute 字符的字符实体引用。)
这意味着当您键入(无效的HTML)“标记的开头”(<
)时,浏览器会将其更正为“小于签名”(<
)但是当您键入“开始”时实体“(&
), 允许,不会发生纠错。
你需要写出你的意思。如果要将某些HTML作为数据包含在内,则必须将具有特殊含义的任何字符转换为其各自的字符引用。
如果数据是:
<div
然后HTML必须是:
<textarea>&lt;div</textarea>
您可以使用标准函数进行转换(例如PHP的htmlspecialchars
或Perl的HTML::Entities module)。
注意1:如果您使用的是XHTML [2](并且实际使用它,如果您将其作为text / html 提供则不计算在内),那么您可以使用显式的CDATA块:
<textarea><![CDATA[<div]]></textarea>
注意2:或者浏览器是否正确实现了HTML 4
好的,但问题是。无论如何它为什么解码它们?假设我添加了&amp; ,保存textarea,ti将被保存&amp; lt; ,但显示为&lt; ,再次保存将其转换回&lt; (但它将保留在&lt;数据库中),再次保存会将其保存为&lt;在数据库中,为什么textarea对其进行解码?
由于浏览器不以HTML格式发送数据,因此字符不会表示为HTML实体。
如果您从客户端收到数据然后将其放入HTML文档,那么您必须先将其编码为HTML。
答案 1 :(得分:18)
在PHP中,这可以使用htmlentities()来完成。示例如下。
<?php
$content = "This string contains the TM symbol: ™";
print "<textarea>". htmlentities($content) ."</textarea>";
?>
如果没有htmlentities(),textarea将解释并显示TM符号(™)而不是“&amp; trade;”。
答案 2 :(得分:1)
您必须确保将其呈现给浏览器:
<textarea name="somename">&lt;div</textarea>
基本上,这意味着&
中的<
必须html编码为&
。如何做将取决于您正在使用的技术。
更新:想想这样。如果您想在textarea中显示 <div>
,则必须对<>
进行编码,否则<div>
将是浏览器的普通HTML元素:
<textarea name="somename"><div></textarea>
说完这个,如果你想在textarea中显示 <div>
,你就必须再次编码&
,因为浏览器在呈现HTML时解码HTML实体。它与您的数据库无关。
答案 3 :(得分:1)
我遇到了同样的问题,我只是在文本中进行了两次替换,然后再将其放入文本区域,以便显示在数据库中:
myString = Replace(myString, "&", "&")
myString = Replace(myString, "<", "<")
替换n:o 1以欺骗textarea显示代码。 替换n:o 2:如果没有此替换,则无法在textarea中显示单词“”(它将结束textarea标记)。
(上面的Asp / vbscript代码,转换为您选择语言的替换方法)
答案 4 :(得分:1)
您可以从单独的页面提供数据库内容,然后使用Javascript(jQuery)Ajax调用将其放在textarea中:
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 :(得分:0)
我找到了一个替代解决方案,用于阅读和使用浏览器,只需使用jQuery读取元素的text(),它返回字符作为显示字符,并允许我使用属性通过textarea写入div的innerHTML HTML()...