繁体   English   中英

php 输出 xml 产生解析错误“'”

[英]php output xml produces parse error "’"

是否有任何函数可以用来解析任何字符串以确保它不会导致 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。

你是怎么得到的&rsquo; 来自用户? 如果他按字面输入,则说明您没有正确处理输入 - 例如,您应该将&amp;转义为&amp; . 如果是你把实体放在那里(也许代替一些撇号),要么在 DTD 中定义它( <!ENTITY rsquo "&x2019;"> )或使用数字符号( &#x2019; )写它,因为几乎每个命名实体都是 HTML 的一部分。 正如 Gumbo 指出的那样,XML 只定义了几个基本的。

根据对问题的补充进行编辑:

  • 在#1 中,如果用户输入]]> <°)))><转义内容,就会出现问题。
  • 在#2 中, 您正在进行编码和解码,从而得到 $content 的原始值。 解码不是必需的(如果您不希望用户发布像&amp;这样的值,应该像 & 那样解释)。

如果您将 htmlspecialchars() 与 ENT_QUOTES 一起使用,应该没问题,但是看看Drupal 是如何做到的

html_entity_decode($string, ENT_QUOTES, 'UTF-8')

将值括在 CDATA 标签内。

<message><![CDATA[&rsquo;]]></message>

w3schools 网站

像“<”和“&”这样的字符在 XML 元素中是非法的。

"<" 会产生一个错误,因为解析器将它解释为一个新元素的开始。

"&" 会产生错误,因为解析器将它解释为字符实体的开始。

某些文本(如 JavaScript 代码)包含大量“<”或“&”字符。 为了避免错误,脚本代码可以定义为 CDATA。

CDATA 部分中的所有内容都被解析器忽略。

问题是你的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 的数据已经由我的代码作为 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);

基本上将 htmlspecialchars 与 ENT_XML1 一起使用应该将用户输入的数据转换为 XML 安全数据(并且对我来说很好用):

htmlspecialchars($string, ENT_XML1, 'UTF-8');

这对我有用。 一些面临同样问题的人可以试试这个。

htmlentities($string, ENT_XML1)

带特殊字符转换。

htmlspecialchars(htmlentities($string, ENT_XML1))

使用 htmlspecialchars() 将解决您的问题。 请参阅下面的帖子。

PHP - htmlentities() 是否足以创建 xml 安全值?

htmlspecialchars($trim($_POST['content'], ENT_XML1, 'UTF-8');

应该做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM