如何阻止html TEXTAREA解码html实体

时间:2011-12-15 11:06:14

标签: html decoding html-entities

我有一个奇怪的问题:

在数据库中,我有一个文字&符号分号:

<div  

无论何时将其打印到html textarea标记中,该页面的源代码都会将>显示为>

如何停止此解码?

6 个答案:

答案 0 :(得分:36)

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

textarea元素的定义是:

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

即。它包含is described as

的PCDATA
  

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

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

你需要写出你的意思。如果要将某些HTML作为数据包含在内,则必须将具有特殊含义的任何字符转换为其各自的字符引用。

如果数据是:

&lt;div

然后HTML必须是:

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

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

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

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

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


  

好的,但问题是。无论如何它为什么解码它们?假设我添加了&amp; ,保存textarea,ti将被保存&amp; lt; ,但显示为&lt; ,再次保存将其转换回&lt; (但它将保留在&lt;数据库中),再次保存会将其保存为&lt;在数据库中,为什么textarea对其进行解码?

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

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

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

答案 1 :(得分:18)

在PHP中,这可以使用htmlentities()来完成。示例如下。

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

如果没有htmlentities(),textarea将解释并显示TM符号(™)而不是“&amp; trade;”。

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

答案 2 :(得分:1)

您必须确保将其呈现给浏览器:

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

基本上,这意味着&中的&lt;必须html编码为&amp;。如何做将取决于您正在使用的技术。

更新:想想这样。如果您想在textarea中显示 <div>,则必须对<>进行编码,否则<div>将是浏览器的普通HTML元素:

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

说完这个,如果你想在textarea中显示 &lt;div&gt;,你就必须再次编码&,因为浏览器在呈现HTML时解码HTML实体。它与您的数据库无关。

答案 3 :(得分:1)

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

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

替换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()...