php 输出 xml 产生解析错误“'”
Posted
技术标签:
【中文标题】php 输出 xml 产生解析错误“\'”【英文标题】:php output xml produces parse error "’"php 输出 xml 产生解析错误“'” 【发布时间】:2011-03-09 17:22:57 【问题描述】:是否有任何函数可以用来解析任何字符串以确保它不会导致 xml 解析问题?我有一个 php 脚本输出一个 xml 文件,其中包含从表单中获取的内容。
问题是,除了来自 php 表单的常见字符串检查外,一些用户文本会导致 xml 解析错误。我特别面对这个“’
”。这是我收到的错误Entity 'rsquo' not defined
有没有人在为 xml 输出编码文本方面有经验?
谢谢!
一些澄清: 我正在从 xml 文件中的表单输出内容,随后由 javascript 解析。
我处理所有表单输入:htmlentities(trim($_POST['content']), ENT_QUOTES, 'UTF-8');
当我想将此内容输出到 xml 文件中时,我应该如何对其进行编码以使其不会引发 xml 解析错误?
到目前为止,以下 2 个解决方案有效:
1)echo '<content><![CDATA['.$content.']]></content>';
2)echo '<content>'.htmlspecialchars(html_entity_decode($content, ENT_QUOTES, 'UTF-8'),ENT_QUOTES, 'UTF-8').'</content>'."\n";
以上两种解决方案安全吗?哪个更好?
谢谢,很抱歉没有早点提供此信息。
【问题讨论】:
我会使用 XML 解析器来查看 XML 解析器是否不会阻塞输入。 这里的问题是 XML 只知道很少的实体可以实际指定字符引用。 (见w3.org/TR/xml/#sec-predefined-ent) 【参考方案1】:html_entity_decode($string, ENT_QUOTES, 'UTF-8')
【讨论】:
解决了&rsquo;
错误但现在出现&amp;
错误?如果我将 &amp;
更改为 &amp;
它修复了错误,但我怎样才能正确解码所有内容?
是的。我正在输出 utf-8。我的 xml 输出以 echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
开头,谢谢【参考方案2】:
你把它弄错了——不要寻找不会给你错误的解析器。而是尝试使用格式良好的 xml。
您是如何从用户那里获得&rsquo;
的?如果他按字面意思输入,则说明您没有正确处理输入 - 例如,您应该将 & 转义为 &amp;
。如果是你把实体放在那里(也许代替一些撇号),要么在 DTD 中定义它(<!ENTITY rsquo "&x2019;">
),要么使用数字符号(&#x2019;
)编写它,因为几乎每个命名实体都是HTML 的一部分。正如 Gumbo 指出的那样,XML 只定义了一些基本的。
根据对问题的补充进行编辑:
在 #1 中,如果用户键入]]> <°)))><
,则您会转义内容。
在 #2 中,&amp;
应该被解释为 &)。
如果您将 htmlspecialchars() 与 ENT_QUOTES 一起使用,应该没问题,但请参阅 how Drupal does it。
【讨论】:
感谢 Krab。我对用户输入所做的就是让他们通过这个:htmlentities($_POST['content'], ENT_QUOTES, 'UTF-8');
。 sleepynate 建议使用 html_entity_decode 修复了&rsquo;
,因为它将它转换回来..但后来我遇到了&
的问题。我该怎么办?这 htmlspecialchars(html_entity_decode($content, ENT_QUOTES, 'UTF-8'),ENT_QUOTES, 'UTF-8')
是否足以确保将来的用户输入不会导致我的 xml 文件出现问题?我需要 xml 文件没有错误,因为 javascript 函数正在解析它。
有什么理由必须使用 htmlentities() 而不是 htmlspecialchars()?
实际上没有特别的原因.. htmlspecialchars() 是否足以处理所有用户输入?那么什么时候会使用 htmlentities() 呢?
所以实际上,如果我已经在 utf-8 中处理、保存和输出输入,我就不需要 htmlentities,而 htmlspecialchars 就足够了吗?谢谢!
也许您可以使用 htmlentities() 来生成包含 unicode 字符的文档,同时保留纯 ASCII 编码。但这仅在您还将字符编码为数字实体时才成立。我不知道。【参考方案3】:
将值括在 CDATA 标记中。
<message><![CDATA[’]]></message>
来自w3schools site:
像“
"
"&" 将产生错误,因为解析器将其解释为字符实体的开始。
有些文本,比如 JavaScript 代码,包含很多“
解析器会忽略 CDATA 部分中的所有内容。
【讨论】:
这是一个很好的解决方案,尽管我对未转义的 CDATA 在代码中的其他地方使用(例如,放入数据库)感到不寒而栗,尽管这与手头的问题。 这是关于 RSS 的正确答案,除非您使用 XHTML DTD。在CDATASection
中使用content:encoded
输出提要时特别有用。【参考方案4】:
问题是你的htmlentities
函数正在做它应该做的——从字符生成 HTML 实体。然后,您将这些插入到没有定义 HTML 实体的 XML 文档中(&rsquo;
之类的东西是特定于 HTML 的)。
处理此问题的最简单方法是保持所有输入原始(即不要使用 htmlentities
解析),然后使用 PHP 的 XML 函数生成您的 XML。
这将确保所有文本都正确编码,并且您的 XML 格式正确。
例子:
$user_input = "...<>&'";
$doc = new DOMDocument('1.0','utf-8');
$element = $doc->createElement("content");
$element->appendChild($doc->createTextNode($user_input));
$doc->appendChild($element);
【讨论】:
感谢波热!目前我只是回显到一个 xml 文件中。我将使用 PHP 的 XML 函数正确生成一个 xml 文档。 :)【参考方案5】:使用 htmlspecialchars() 将解决您的问题。请参阅下面的帖子。
PHP - Is htmlentities() sufficient for creating xml-safe values?
【讨论】:
【参考方案6】:我有一个类似的问题,我需要添加到 XML 中的数据已经由我的代码作为 htmlentities() 返回(不在这样的数据库中)。
我用过:
$doc = new DOMDocument('1.0','utf-8');
$element = $doc->createElement("content");
$element->appendChild($doc->createElement('string', htmlspecialchars(html_entity_decode($string, ENT_QUOTES, 'UTF-8'), ENT_XML1, 'UTF-8')));
$doc->appendChild($element);
或者如果它不在 htmlentities() 中 只是下面应该工作
$doc = new DOMDocument('1.0','utf-8');
$element = $doc->createElement("content");
$element->appendChild($doc->createElement('string', htmlspecialchars($string, ENT_XML1, 'UTF-8')));
$doc->appendChild($element);
基本上使用带有 ENT_XML1 的 htmlspecialchars 应该将用户估算的数据转换为 XML 安全数据(并且对我来说很好):
htmlspecialchars($string, ENT_XML1, 'UTF-8');
【讨论】:
【参考方案7】:htmlspecialchars($trim($_POST['content'], ENT_XML1, 'UTF-8');
应该这样做。
【讨论】:
【参考方案8】:这对我有用。遇到同样问题的人可以试试这个。
htmlentities($string, ENT_XML1)
带特殊字符的转换。
htmlspecialchars(htmlentities($string, ENT_XML1))
【讨论】:
以上是关于php 输出 xml 产生解析错误“'”的主要内容,如果未能解决你的问题,请参考以下文章