如何阻止 html TEXTAREA 解码 html 实体
Posted
技术标签:
【中文标题】如何阻止 html TEXTAREA 解码 html 实体【英文标题】:How to stop an html TEXTAREA from decoding html entities 【发布时间】:2012-01-21 02:07:45 【问题描述】:我有一个奇怪的问题:
在数据库中,我有一个文字和符号 lt 分号:
<div
无论何时打印到 html textarea 标签中,页面的源代码都会将&gt;
显示为>
。
如何停止解码?
【问题讨论】:
你是如何打印出来的?页面源代码是什么样的? 你使用 html_entity_decode()??? 什么语言?什么平台? Why does <textarea> display <> instead of <>?的可能重复 【参考方案1】:您无法阻止实体在 textarea[1] 中被解码,因为 textarea 的内容不是(与脚本或样式元素不同)内在 CDATA,即使错误恢复可能有时给人的印象是。
textarea元素的定义是:
<!ELEMENT TEXTAREA - - (#PCDATA) -- multi-line text field -->
即它包含 PCDATA 其中is described as:
文档文本(由 SGML 构造“#PCDATA”表示)。文本可能包含字符引用。回想一下,它们以
&
开头并以分号结尾(例如,Herg&eacute;'s adventures of Tintin
包含 e 锐角 字符的字符实体引用)。
这意味着当您键入(无效的 HTML)“标记开头”(&lt;
)时,浏览器会将其更正为“小于号”(&lt;
)但是当您键入“实体开头”( &
),是允许的,不会进行纠错。
你需要写下你的意思。如果您想包含一些 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
服务器发送(到浏览器)编码为HTML的数据。 浏览器将编码为application/x-www-form-urlencoded(或multipart/form-data)的数据发送(到服务器)。好的,但问题是。为什么它仍然解码它们?假设我添加了 & ,保存 textarea , ti 将被保存 < ,但显示为
由于浏览器不以 HTML 格式发送数据,因此字符不表示为 HTML 实体。
如果你从客户端接收到的数据,然后将其放入 HTML 文档中,那么你必须先将其编码为 HTML。
【讨论】:
【参考方案2】:在 PHP 中,这可以使用 htmlentities() 来完成。下面的例子。
<?php
$content = "This string contains the TM symbol: ™";
print "<textarea>". htmlentities($content) ."</textarea>";
?>
如果没有 htmlentities(),textarea 将解释并显示 TM 符号 (™) 而不是“™”。
http://php.net/manual/en/function.htmlentities.php
【讨论】:
好在它甚至不需要在表单提交后进行转换,因为浏览器会解码htmlentities
。【参考方案3】:
您可以从单独的页面提供您的 DB 内容,然后使用 javascript (jQuery) Ajax 调用将其放置在文本区域中:
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/
【讨论】:
是的!element.value
而不是直接的 HTML 填充就可以了。【参考方案4】:
您必须确保将其呈现给浏览器:
<textarea name="somename">&lt;div</textarea>
本质上,这意味着&lt;
中的&amp;
必须被html 编码为&amp;
。如何做到这一点取决于您使用的技术。
更新:这样想。如果您想在文本区域内显示 &lt;div&gt;
,则必须对 &lt;&gt;
进行编码,否则,&lt;div&gt;
将是浏览器的普通 HTML 元素:
<textarea name="somename"><div></textarea>
话虽如此,如果您想在文本区域内显示 &lt;div&gt;
,您必须再次编码&amp;
,因为浏览器在呈现HTML 时会解码HTML 实体。它与您的数据库无关。
【讨论】:
好的,但问题是。为什么它仍然解码它们?假设我添加了 & , 保存 textarea , ti 将被保存 < , 但显示为 < ,再次保存会将其转换回 < ,为什么 textarea 会对其进行解码? 浏览器根据 HTML 标准进行解码。如果显示在<textarea/>
之外,它将被解码。因此,您必须将&amp;
编码到浏览器,而不是数据库。反过来想。如果您想向浏览器显示&lt;div&gt;
(是否为文本区域)。如果不将&lt;&gt;
编码为&lt;&gt;
,你会怎么做?你不能因为&lt;div&gt;
会被解释为一个HTML 元素。现在,递归这个想法。如果不编码&amp;
...,如何在浏览器中显示&lt;div&gt;
?
如果您查看页面的源代码,它显示为&lt;
,但在浏览器中它被解码为<
!!!我知道这是不可能的,但它的发生是积极的
@RonanDejhero:现在对你的问题有两个有趣的解释,剩下的思考,你必须自己做,恐怕......除非你拒绝理解事情是如何发生的工作:-)
@Ronan Dejhero — 这并非不可能,这是 HTML 规范要求发生的。【参考方案5】:
我遇到了同样的问题,我只是对要从数据库中显示的文本进行了两次替换,然后才将其放入文本区域:
myString = Replace(myString, "&", "&")
myString = Replace(myString, "<", "<")
替换 n:o 1 以欺骗 textarea 以显示代码。 替换 n:o 2:如果没有此替换,您将无法在 textarea 中显示单词“”(它将结束 textarea 标记)。
(上面的 Asp / vbscript 代码,翻译成您选择的语言的替换方法)
【讨论】:
【参考方案6】:我找到了一种在浏览器中阅读和使用的替代解决方案,只需使用 jQuery 读取元素的 text(),它将字符作为显示字符返回,并允许我使用属性从 textarea 写入 div 的 innerHTML html()...
【讨论】:
以上是关于如何阻止 html TEXTAREA 解码 html 实体的主要内容,如果未能解决你的问题,请参考以下文章