4

重複の可能性:
PHP - フレーズを別のフレーズに置き換えるには?

このhtmlを変換する必要があります

<html>
   <body>
      Lorum ipsum <a href="http://google.com">click here</a> dolores lorem.
      Lorum ipsum <a href="http://stackoverflow.com">click here too</a> dolores lorem.
   </body>
</html>

に:

<html>
    <body>
       Lorum ipsum @@1@@ dolores lorem.
       Lorum ipsum @@2@@ dolores lorem.
    </body>
</html>

Domdocument を使用してこれをどのように達成できますか (正規表現ソリューションには興味がありません)。

4

1 に答える 1

6

これまでコードを表示していないため、実行する問題が明確ではありません。それを変更するリンクのリストを反復すると、反復が無効になるためだと推測できます。したがって、最初の要素のみが置き換えられます。

ループを使用すると、for各反復ごとに最初の a 要素のみを取得するのに役立ちます。また、置換に必要な数値のカウント変数を初期化して増やすこともできます。

交換自体は で簡単にできますreplaceChild。ループの例:

for($c = 1; $a = $doc->getElementsByTagName('a')->item(0); $c++) {
    $a->parentNode->replaceChild(
        $doc->createTextNode(sprintf("@@%d@@", $c)),
        $a
    );
}

への呼び出しは、そのような要素が (もはや) 存在しない場合$doc->getElementsByTagName('a')->item(0)に返されます。NULLそれがループの終了条件です。

完全な例:

$html = '<html><body>
  Lorum ipsum <a href="http://google.com">click here</a> dolores lorem.
  Lorum ipsum <a href="http://stackoverflow.com">click here too</a> dolores lorem.
</body></html>';

$doc = new DOMDocument();
$doc->loadHtml($html);

for($c = 1; $a = $doc->getElementsByTagName('a')->item(0); $c++) {
    $a->parentNode->replaceChild(
        $doc->createTextNode(sprintf("@@%d@@", $c)),
        $a
    );
}

echo $doc->saveHTML();

出力:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
  Lorum ipsum @@1@@ dolores lorem.
  Lorum ipsum @@2@@ dolores lorem.
</body></html>

これがお役に立てば幸いです。

于 2012-11-07T09:32:53.863 に答える