如何阻止 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 标签中,页面的源代码都会将> 显示为>

如何停止解码?

【问题讨论】:

你是如何打印出来的?页面源代码是什么样的? 你使用 html_entity_decode()??? 什么语言?什么平台? Why does <textarea> display <> instead of &lt;&gt;?的可能重复 【参考方案1】:

您无法阻止实体在 textarea[1] 中被解码,因为 textarea 的内容不是(与脚本或样式元素不同)内在 CDATA,即使错误恢复可能有时给人的印象是。

textarea元素的定义是:

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

即它包含 PCDATA 其中is described as:

文档文本(由 SGML 构造“#PCDATA”表示)。文本可能包含字符引用。回想一下,它们以 &amp; 开头并以分号结尾(例如,Herg&amp;eacute;'s adventures of Tintin 包含 e 锐角 字符的字符实体引用)。

这意味着当您键入(无效的 HTML)“标记开头”(&amp;lt;)时,浏览器会将其更正为“小于号”(&amp;lt;)但是当您键入“实体开头”( &amp;),允许的,不会进行纠错。

你需要写下你的意思。如果您想包含一些 HTML 作为数据,那么您必须将任何具有特殊含义的字符转换为其各自的字符引用。

如果数据是:

&lt;div

那么 HTML 必须是:

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

您可以使用标准函数进行转换(例如 phphtmlspecialchars 或 Perl 的 HTML::Entities module)。

注意 1:如果您使用的是 XHTML[2](并且确实在使用它,如果您将其作为 text/html 提供,则不算数),那么您可以使用显式的 CDATA 块:

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

注意 2:或者浏览器是否正确实现了 HTML 4


好的,但问题是。为什么它仍然解码它们?假设我添加了 & ,保存 textarea , ti 将被保存 < ,但显示为

服务器发送(到浏览器)编码为HTML的数据。 浏览器将编码为application/x-www-form-urlencoded(或multipart/form-data)的数据发送(到服务器)。

由于浏览器不以 HTML 格式发送数据,因此字符不表示为 HTML 实体。

如果你从客户端接收到的数据,然后将其放入 HTML 文档中,那么你必须先将其编码为 HTML。

【讨论】:

【参考方案2】:

在 PHP 中,这可以使用 htmlentities() 来完成。下面的例子。

<?php
  $content = "This string contains the TM symbol: &trade;";
  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">&amp;lt;div</textarea>

本质上,这意味着&amp;lt; 中的&amp;amp; 必须被html 编码为&amp;amp;。如何做到这一点取决于您使用的技术。

更新:这样想。如果您想在文本区域内显示 &amp;lt;div&amp;gt;,则必须对 &amp;lt;&amp;gt; 进行编码,否则,&amp;lt;div&amp;gt; 将是浏览器的普通 HTML 元素:

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

话虽如此,如果您想在文本区域内显示 &amp;lt;div&amp;gt;,您必须再次编码&amp;amp;,因为浏览器在呈现HTML 时会解码HTML 实体。它与您的数据库无关。

【讨论】:

好的,但问题是。为什么它仍然解码它们?假设我添加了 & , 保存 textarea , ti 将被保存 &lt; , 但显示为 < ,再次保存会将其转换回 < ,为什么 textarea 会对其进行解码? 浏览器根据 HTML 标准进行解码。如果显示在&lt;textarea/&gt; 之外,它将被解码。因此,您必须将&amp;amp; 编码到浏览器,而不是数据库。反过来想。如果您想向浏览器显示&amp;lt;div&amp;gt;(是否为文本区域)。如果不将&amp;lt;&amp;gt; 编码为&amp;lt;&amp;gt;,你会怎么做?你不能因为&amp;lt;div&amp;gt; 会被解释为一个HTML 元素。现在,递归这个想法。如果不编码&amp;amp;...,如何在浏览器中显示&amp;lt;div&amp;gt; 如果您查看页面的源代码,它显示为&amp;lt;,但在浏览器中它被解码为&lt; !!!我知道这是不可能的,但它的发生是积极的 @RonanDejhero:现在对你的问题有两个有趣的解释,剩下的思考,你必须自己做,恐怕......除非你拒绝理解事情是如何发生的工作:-) @Ronan Dejhero — 这并非不可能,这是 HTML 规范要求发生的。【参考方案5】:

我遇到了同样的问题,我只是对要从数据库中显示的文本进行了两次替换,然后才将其放入文本区域:

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

替换 n:o 1 以欺骗 textarea 以显示代码。 替换 n:o 2:如果没有此替换,您将无法在 textarea 中显示单词“”(它将结束 textarea 标记)。

(上面的 Asp / vbscript 代码,翻译成您选择的语言的替换方法)

【讨论】:

【参考方案6】:

我找到了一种在浏览器中阅读和使用的替代解决方案,只需使用 jQuery 读取元素的 text(),它将字符作为显示字符返回,并允许我使用属性从 textarea 写入 div 的 innerHTML html()...

【讨论】:

以上是关于如何阻止 html TEXTAREA 解码 html 实体的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap textarea 显示 html 和阻止按钮

如何阻止 textarea 标签翻译数字

如何阻止在textarea中输入回车?

HTML textarea标签大小改变[重复]

如何阻止文本区域自动换行? [复制]

如何在可编辑的 TextArea 中禁用回车?