【问题标题】:How to stop an html TEXTAREA from decoding html entities如何阻止 html TEXTAREA 解码 html 实体
【发布时间】:2012-01-21 02:07:45
【问题描述】:

我有一个奇怪的问题:

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

<div  

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

如何停止解码?

【问题讨论】:

标签: html decoding html-entities


【解决方案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>

您可以使用标准函数进行转换(例如 PHP 的 htmlspecialchars 或 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()...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 2015-09-26
        • 2012-05-26
        相关资源
        最近更新 更多