基本上我想要实现的是用一个页面中相应的data-src-nodes的内容替换一堆img-nodes的src-attributes的内容。如下所示。
<html>
<body>
<div id="a">
<img src="" data-src="myValue" />
<img src="" data-src="myValue2" />
</div>
<img src="" data-src="myValue" />
</body>
</html>
我想通过找到一个公共基节点(在这种情况下,div中的img节点,其id为 a )并基于该节点
来实现此目的脚本
<?PHP
$html = '<html><body><div id="a"><img src="" data-src="myValue"/><img src="" data-src="myValue2"/></div><img src="" data-src="myValue"/></body></html>';
$doc = new DOMDocument();
@$doc->loadHTML($html);
$basenode = false;
$xpath = new DOMXPath($doc);
$entries = $xpath->query('(//div[@id="a"])');
if ($entries->length > 0) $basenode = $entries->item(0);
if ($basenode) {
$img = $xpath->query('//img', $basenode);
foreach ($img as $curImg) {
$from = $xpath->query('//@data-src', $curImg);
$to = $xpath->query('//@src', $curImg);
$to->item(0)->value = $from->item(0)->value;
}
echo $doc->saveXML();
}
?>
预期输出
<html>
<body>
<div id="a">
<img src="myValue" data-src="myValue" />
<img src="myValue2" data-src="myValue2" />
</div>
<img src="" data-src="myValue" />
</body>
</html>
实际输出
<html>
<body>
<div id="a">
<img src="myValue" data-src="myValue" />
<img src="" data-src="myValue2" />
</div>
<img src="" data-src="myValue" />
</body>
</html>
所以,行
$from = $xpath->query('//@data-src', $curImg);
似乎实际上是在根节点上进行搜索,而不是之前选择的img节点。我该如何解决这个问题?
(我知道可能的解决方法是省略明确选择img-nodes并执行类似from ='// div [@ id =“a”] / img / @ data-src'和='' // div [@ id =“a”] / img / @src'但我有点担心,我最终可能会在不同节点的属性之间复制值)
答案 0 :(得分:0)
/
指定绝对位置路径(即,从文档根目录)。相反,您希望使用 relative (相对于上下文节点)。
例如; .//@data-src
或descendant::img/@data-src
,等等。