替换DOM中的标签

时间:2014-03-17 15:08:01

标签: php dom

我尝试将HTML字符串中的链接替换为文本,但因为我在迭代中替换了源代码,我得到了奇怪的混合结果。不知道如何解决这个问题:

$body='<a href="link1">text1</a> and <a href="link2">text2</a> and <a href="link3">text3</a>';
$dom = new DOMDocument();
$dom->loadHTML($body);

$anchors = $dom->getElementsByTagName('a');
foreach($anchors as $anchor) {
    $link = $anchor->getAttribute('href');
    $text = $anchor->nodeValue;
    $new = $dom->createTextNode($text."\n".$link."\n");
    $anchor->parentNode->replaceChild($new,$anchor);
    echo($text); //debug
}
$body_plain = $dom->saveHTML();

必须成为:

text1
link1
and
text2
link2
and
text3
link3

但是第二个链接不会被替换。调试时,它会跳过第二个链接:

text1
link1 and <a href="link2">text2</a> and
text3
link3

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

getElementsByTagName生成 live 节点列表。在用文本替换第一个链接后,代码会在生成的DOM 中查找第二个链接,这是原始链接中的第三个链接。

就个人而言,我更喜欢使用XPath,即使是简单的事情:

$xpath = new DOMXPath($dom);
$anchors = $xpath->query("//a");

这会起作用;)