在下面的代码中,我尝试用某些html替换$content
中找到的每个图像。使用$dom->saveHTML($image)
我得到了图片html,但str_replace
并没有替换它。我不知道为什么。
$content = '<div class="content"><img src="some-image.png"></div>';
$dom = new DOMDocument;
$dom->loadHTML($content);
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
$i = $dom->saveHTML($image);
$replacement = '<div class="test"><a href="#">some link</a><span>test</span></div>';
$content = str_replace($i, $replacement, $content);
}
// $content should be altered with the previous edits.
return $content;
最后,$content
应该返回:
<div class="content"><div class="test"><a href="#">some link</a><span>test</span></div></div>
有什么想法吗?
答案 0 :(得分:3)
替换 DOMNode 的方法是使用方法replaceChild
(str_replace
仅用于处理字符串):
$dom = new DOMDocument;
$dom->loadHTML($content);
$imgNodeList = $dom->getElementsByTagName('img');
foreach ($imgNodeList as $imgNode) {
$divNode = $dom->createElement('div');
$textNode = $dom->createTextNode('test');
$divNode->appendChild($textNode);
$imgNode->parentNode->replaceChild($divNode, $imgNode);
}
如果替换比包含文本的div标签更精细,则只需要以相同的方式构建替换节点(将其他节点附加到其上)。要处理属性,请参阅http://php.net/manual/en/domdocument.createattribute.php
答案 1 :(得分:3)
$dom = new DOMDocument;
$dom->loadHTML($content);
$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
$node = $dom->createElement("div");
$frag = $dom->createDocumentFragment(); // create fragment
$frag->appendXML('<div class="test"><a href="#">some link</a><span>test</span></div>');
$node.appendChild($frag);
$image->parentNode->replaceChild($node, $image);
}
这是HTML。 HTML的动态特性使得正确执行正则表达式或字符串替换非常困难。但是,PHP允许通过DomDocument
进行dom操作。因此,选择图像parentNode并用div替换图像。
使用createDocumentFragment()
更新了它。这将在内存中创建一个DOM片段。您可以将XML(读取HTML)作为字符串附加到它。然后,您可以将片段附加到节点。