我尝试将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
任何帮助表示感谢。
答案 0 :(得分:1)
getElementsByTagName
生成 live 节点列表。在用文本替换第一个链接后,代码会在生成的DOM 中查找第二个链接,这是原始链接中的第三个链接。
就个人而言,我更喜欢使用XPath,即使是简单的事情:
$xpath = new DOMXPath($dom);
$anchors = $xpath->query("//a");
这会起作用;)