基本上,我想要实现的是将一堆 img-nodes 的 src-attributes 的内容替换为页面中相应 data-src-nodes 的内容,如下所示。
<html>
<body>
<div id="a">
<img src="" data-src="myValue" />
<img src="" data-src="myValue2" />
</div>
<img src="" data-src="myValue" />
</body>
</html>
我想通过找到一个公共基础节点(在本例中为 div 中具有 id a的 img 节点)并基于该节点来做到这一点
- 包含要复制的值的节点和#
- 检索值的节点
脚本
<?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-node 进行搜索。我该如何解决这个问题?
(我知道一个可能的解决方法是省略显式选择 img 节点并执行类似 from='//div[@id="a"]/img/@data-src' 和 to='//div [@id="a"]/img/@src' 但我有点担心,我可能最终会在不同节点的属性之间复制值)