基本的に私が達成しようとしているのは、一連の img ノードの src 属性のコンテンツを、次のようなページの対応する data-src ノードのコンテンツに置き換えることです。
<html>
<body>
<div id="a">
<img src="" data-src="myValue" />
<img src="" data-src="myValue2" />
</div>
<img src="" data-src="myValue" />
</body>
</html>
共通のベース ノード (この場合は id aの div 内の 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-nodes の明示的な選択を省略し、from='//div[@id="a"]/img/@data-src' および to='//div のようなことを行うことです。 [@id="a"]/img/@src' ですが、異なるノードの属性間で値をコピーしてしまうのではないかと少し心配です)