[英]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。
你是怎么得到的’
来自用户? 如果他按字面输入,则说明您没有正确处理输入 - 例如,您应该将&
转义为&
. 如果是你把实体放在那里(也许代替一些撇号),要么在 DTD 中定义它( <!ENTITY rsquo "&x2019;">
)或使用数字符号( ’
)写它,因为几乎每个命名实体都是 HTML 的一部分。 正如 Gumbo 指出的那样,XML 只定义了几个基本的。
根据对问题的补充进行编辑:
]]> <°)))><
转义内容,就会出现问题。&
这样的值,应该像 & 那样解释)。如果您将 htmlspecialchars() 与 ENT_QUOTES 一起使用,应该没问题,但是看看Drupal 是如何做到的。
html_entity_decode($string, ENT_QUOTES, 'UTF-8')
将值括在 CDATA 标签内。
<message><![CDATA[’]]></message>
像“<”和“&”这样的字符在 XML 元素中是非法的。
"<" 会产生一个错误,因为解析器将它解释为一个新元素的开始。
"&" 会产生错误,因为解析器将它解释为字符实体的开始。
某些文本(如 JavaScript 代码)包含大量“<”或“&”字符。 为了避免错误,脚本代码可以定义为 CDATA。
CDATA 部分中的所有内容都被解析器忽略。
问题是你的htmlentities
函数正在做它应该做的 - 从字符生成 HTML 实体。 然后将这些插入到没有定义 HTML 实体的 XML 文档中(像’
类的东西是特定于 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() 将解决您的问题。 请参阅下面的帖子。
htmlspecialchars($trim($_POST['content'], ENT_XML1, 'UTF-8');
应该做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.