使用 PHP 解析 DOMDocument 时出错



我们正在将我们的软件升级到 PHP 7.2.3,我有以下代码片段,在以前的版本中运行良好:

$doc = new DOMDocument();
$doc->loadHTML("<html><body>".($_POST['reportForm_structure'])."</body></html>");
$root = $doc->documentElement->firstChild->firstChild->firstChild;
file_put_contents('D:testoutput.txt', print_r($root ,true));
foreach($root->childNodes as $child) {
if ($child->nodeName == "ul") {
foreach($child->childNodes as $ulChild) {
$this->loadNodes($ulChild, $this->report);
}
}           
}

file_put_contents仅用于错误研究。

我收到以下错误:Invalid argument supplied for foreach().该消息引用第一个 foreach 循环所在的代码行。因此,数据结构未正确初始化。我可以看到从HTML到DOMDocument的转换不再正常工作。 当我检查file_put_contents的输出时,我可以看到$root是一个DOMText对象而不是DOMElement对象,但为什么呢?当将loadHTML的参数直接传递给file_put_contents时,

file_put_contents('D:testoutput.txt', print_r("<html><body>".($_POST['reportForm_structure'])."</body></html>", true);

输出看起来像正确的 HTML,所以这就是为什么我对我不再工作感到困惑的原因。

<html><body><ul class="ltr">
<li class="open last" id="root" rel="root">
<a href="#"><ins>&nbsp;</ins>HeaderText</a>
<ul><li class="open last" id="id1" rel="header"><a href="#"><ins>&nbsp;</ins>Test123</a>
<ul><li class="open leaf last" id="id2" rel="header"><a class="clicked" href="#"><ins>&nbsp;</ins>Test456</a></li></ul></li></ul></li>

有谁知道如何解决这个问题。我在这里的配置中遗漏了什么吗?

我无法使用您显示的代码重现 DOMText 节点。但我的猜测是你保留了空格,然后获取 ul 元素和 li 元素之间的空格节点。

v-------- whitespace node
<html><body><ul class="ltr">
<li class="open last" id="root" rel="root">

在任何情况下,如果您想要 ID 为"root"的元素,请使用更精确的查询,例如使用

$root = $doc->getElementById("root");

您也可以设置$doc->preserveWhiteSpace = false但最好按 ID 查询节点,而不是遍历三个子节点并假设它是该节点。

感谢@Gordon和@DarsVaeda为我指出正确的方向。DOMDocument将回车符和制表符解释为文本节点。我不得不删除它们才能使其再次工作。改变

$doc->loadHTML("<html><body>".$_POST['reportForm_structure']."</body></html>");

$doc = new DOMDocument();       
$string = trim(preg_replace('/t+/', '', $_POST['reportForm_structure']));
$string = preg_replace( "/r|n/", "", $string );       
$doc->loadHTML("<html><body>".$string."</body></html>");

相关内容

  • 没有找到相关文章

最新更新