我们正在将我们的软件升级到 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> </ins>HeaderText</a>
<ul><li class="open last" id="id1" rel="header"><a href="#"><ins> </ins>Test123</a>
<ul><li class="open leaf last" id="id2" rel="header"><a class="clicked" href="#"><ins> </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>");