请注意,“if (! $sxe) {" 可能会在 XML 文档为空(例如,“<root />”)时产生假阴性。在这种情况下,$sxe 将为
object(SimpleXMLElement)#1 (0) {
}
它将被评估为 false,即使在技术上没有出错。
建议改为:“if ($sxe === false) {"
在加载文档时处理 XML 错误是一项非常简单的任务。使用 libxml 功能,可以抑制在加载文档时发生的所有 XML 错误,然后遍历这些错误。
libXMLError 对象(由 libxml_get_errors() 返回)包含多个属性,包括错误的 消息、行 和 列(位置)。
示例 #1 加载损坏的 XML 字符串
<?php
libxml_use_internal_errors(true);
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
if ($sxe === false) {
echo "Failed loading XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
?>
上面的示例将输出
Failed loading XML Blank needed here parsing XML declaration: '?>' expected Opening and ending tag mismatch: xml line 1 and broken Premature end of data in tag broken line 1
请注意,“if (! $sxe) {" 可能会在 XML 文档为空(例如,“<root />”)时产生假阴性。在这种情况下,$sxe 将为
object(SimpleXMLElement)#1 (0) {
}
它将被评估为 false,即使在技术上没有出错。
建议改为:“if ($sxe === false) {"
如果您需要处理损坏的 XML 文档的内容,您可能会发现这一点很有趣。它已经帮我解决了几个简单的损坏问题。
https://php.net/manual/en/class.domdocument.php#domdocument.props.recover
现在,/e 修饰符在 preg_replace 中被认为已弃用,您可以使用负向先行来将未转义的和号替换为 &,而不会引发警告
$str = preg_replace('/&(?!;{6})/', '&', $str);
实际上,您可能应该在 /e 已弃用之前就进行此操作。
如果您尝试加载包含一些转义和一些未转义的和号的 XML 字符串,您可以预先解析字符串以转义未转义的和号,而不会修改已转义的和号
<?php
$s = preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&'.substr('\\0',1))", $s);
?>