如何使用DOMDocument用字符串替换节点

时间:2012-11-07 08:54:10

标签: php replace domdocument

  

可能重复:
  PHP - How to replace a phrase with another?

我需要转换这段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实现这一点(我对een regex解决方案不感兴趣)?

1 个答案:

答案 0 :(得分:4)

到目前为止,您还没有显示任何代码,因此不清楚您运行的是哪个问题。我只能假设这是因为如果你迭代更改它的链接列表,迭代将变得无效。所以只有第一个元素被替换。

使用for循环可以帮助这里每次迭代只获得第一个元素。它还允许初始化和增加替换所需数字的计数变量。

使用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>

我希望这有用。