用DOMDocument替换div的图像标记并返回改变的html

时间:2015-02-01 13:18:38

标签: php domdocument

在下面的代码中,我尝试用某些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>

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

替换 DOMNode 的方法是使用方法replaceChildstr_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)作为字符串附加到它。然后,您可以将片段附加到节点。