0

基本上,我想要实现的是将一堆 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' 但我有点担心,我可能最终会在不同节点的属性之间复制值)

4

1 回答 1

0

/在开头指定一个绝对位置路径(即,从文档根目录开始)。相反,您想使用相对的(相对于上下文节点)。

例如; .//@data-src, 或descendant::img/@data-src, 等等。

于 2013-11-01T15:15:59.797 回答