如何阻止 html TEXTAREA 解码 html 实体

新手上路,请多包涵

我有一个奇怪的问题:

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

 <div

每当它打印到 html textarea 标签中时,页面的源代码都会显示 > 作为 >

如何停止此解码?

原文由 Rami Dabain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 917
2 个回答

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

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

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

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

原文由 Chris Hubbard 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

textarea 元素的定义是:

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

即它包含 PCDATA,它 被描述为

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

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

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

如果数据是:

 &lt;div

那么 HTML 必须是:

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

您可以使用标准函数来转换它(例如 PHP 的 htmlspecialchars 或 Perl 的 HTML::Entities 模块)。

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

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

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


好的,但问题是。为什么它仍然解码它们?假设我已经添加 & ,保存 textarea , ti 将被保存 &lt; ,但显示为 < ,再次保存会将其转换回 < (但它将保留 < 在数据库中),再次保存会将其保存为 < 在数据库中,为什么 textarea 解码它?

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

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

如果你把从客户端接收到的数据放到一个HTML文档中,那么你必须先把它编码成HTML。

原文由 Quentin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题