php - XML 解析器错误 : entity not defined

标签 php xml tinymce entity simplexml

我在 stackoverflow 上搜索过这个问题,确实找到了一些主题,但我觉得在这方面对我来说并没有一个可靠的答案。

我有一个用户提交的表单,该字段的值存储在一个 XML 文件中。 XML 设置为使用 UTF-8 编码。

用户不时会从某处复制/粘贴文本,这时我会收到“实体未定义错误”。

我意识到 XML 只支持少数几个实体,除此之外的任何实体都无法识别 - 因此出现解析器错误。

据我所知,我看到了几个选项:

  1. 我可以找到并替换所有   并将它们替换为 或实际空间。
  2. 我可以将有问题的代码放在 CDATA 部分中。
  3. 我可以在 XML 文件中包含这些实体。

我对 XML 文件所做的是,用户可以将内容输入到表单中,然后将其存储在 XML 文件中,然后该内容在网页上显示为 XHTML(使用 SimpleXML 解析)。

在三个选项中,或者我不知道的任何其他选项中,处理这些实体的最佳方式是什么?

谢谢, 瑞恩

更新

我要感谢大家的精彩反馈。我实际上确定了导致我的实体错误的原因。所有的建议让我更深入地研究它!

一些文本框是普通的旧文本框,但我的文本区域使用 TinyMCE 进行了增强。事实证明,在仔细观察时,PHP 警告总是引用来自 TinyMCE 增强文本区域的数据。后来我注意到在 PC 上所有字符都被取出(因为它无法读取它们),但在 MAC 上你可以看到引用该字符的 unicode 编号的小方框。它首先在 MAC 上显示为正方形的原因是,我使用 utf8_encode 对非 UTF 格式的数据进行编码,以防止其他解析错误(这在某种程度上也与 TinyMCE 有关)。

解决这一切的方法很简单:

我在 tinyMCE.init 中添加了这一行 entity_encoding : "utf-8"。现在,所有角色都以他们应该的方式出现了。

我想我唯一不明白的是为什么字符放在文本框中时仍然显示,因为没有任何东西可以将它们转换为 UTF,但是对于 TinyMCE,这是一个问题。

最佳答案

我同意这纯粹是一个编码问题。在 PHP 中,我是这样解决这个问题的:

  1. 在将 html 片段传递给 SimpleXMLElement 构造函数之前,我使用 html_entity_decode 对其进行了解码。

  2. 然后使用utf8_encode()进一步编码。

$headerDoc = '<temp>' . utf8_encode(html_entity_decode($headerFragment)) . '</temp>'; 
$xmlHeader = new SimpleXMLElement($headerDoc);

现在上面的代码不会抛出任何undefined entity错误。

关于php - XML 解析器错误 : entity not defined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3805050/

相关文章:

php - Symfony3授权流程

php - 使用 Javascript 显示不断变化的 php 值?

xml - 当被告知返回 false 时,模板返回 true()

drop-down-menu - 在tinymce中添加自定义下拉列表

javascript - 将tinyMCE 内容与原始内容进行比较

php - 将 php 参数绑定(bind)到类中的 mysqli 准备语句中

php - 将 PHP SQL 转换为 Joomla SQL 查询

java - 如何从多行 EditText 中获取字符串文本

xml - 在 xpath 表达式中不使用命名空间

javascript - TinyMCE 如何将 baseURL 附加到 LINK 和图像的基本路径