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