用 DOMDocument 和 return 替换图像标签 div 改变 html

Replace image tag by div with DOMDocument and return altered html

在下面的代码中,我尝试用 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 应该 return:

<div class="content"><div class="test"><a href="#">some link</a><span>test</span></div></div>

有什么想法吗?

替换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

$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 操作。所以 select 图像 parentNode 并用 div.

替换图像

使用 createDocumentFragment() 更新了它。这将在内存中创建一个 DOM 片段。您可以将 XML(阅读 HTML)作为字符串附加到它。然后您可以将片段附加到节点。