0

基本的に私が達成しようとしているのは、一連の 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' ですが、異なるノードの属性間で値をコピーしてしまうのではないかと少し心配です)

4

1 に答える 1

0

/最初に、絶対ロケーション パス (つまり、ドキュメント ルートから) を指定します。代わりに、(コンテキスト ノードに相対的な) 相対ノード を使用します。

例えば; .//@data-src、またはdescendant::img/@data-srcなど。

于 2013-11-01T15:15:59.797 に答える