我想替换我的html上的所有图像,但代码替换一个并转义一个,依此类推
我使用DOMDocument替换我的内容上的图像,我使用下一个代码问题是代码转义图像 例如
1 2 3 4图像代码替换一个和三个并且转出拖车和四个等等
$dom = new \DOMDocument();
$dom->loadHTML("data"));
$dom->preserveWhiteSpace = true;
$count = 1;
$images = $dom->getElementsByTagName('img');
foreach ($images as $img) {
$src = $img->getAttribute('src');
$newsrc = $dom->createElement("newimg");
$newsrc->nodeValue = $src;
$newsrc->setAttribute("id","qw".$count);
$img->parentNode->replaceChild($newsrc, $img);
$count++;
}
$html = $dom->saveHTML();
return $html;
html代码是
<p><img class="img-responsive" src="http://www.jarofquotes.com/img/quotes/86444b28aa86d706e33246b823045270.jpg" alt="" width="600" height="455" /></p>
<p> </p>
<p>some text</p>
<p> </p>
<p><img class="img-responsive" src="http://40.media.tumblr.com/c0bc20fd255cc18dca150640a25e13ef/tumblr_nammr75ACv1taqt2oo1_500.jpg" alt="" width="480" height="477" /></p>
<p> </p>
<p><span class="marker"><img class="img-responsive" src="http://wiselygreen.com/wp-content/uploads/green-living-coach-icon.png" alt="" width="250" height="250" /><br /><br /></span></p>
我希望输出html用
替换所有图像 <newimg>Src </newimg>
答案 0 :(得分:2)
好的,我找不到适合PHP的欺骗,所以我正在回答这个问题。
您面临的问题是getElementsByTagName()
返回的NodeLists是实时列表。这意味着,当您对replaceChild()
进行调用时,您正在改变当前正在迭代的NodeList。
我们假设我们有这个HTML:
$html = <<< HTML
<html>
<body>
<img src="1.jpg"/>
<img src="2.jpg"/>
<img src="3.jpg"/>
</body>
</html>
HTML;
现在让我们将其加载到DOMDocument
并获取img
元素:
$dom = new DOMDocument;
$dom->loadHTML($html);
$allImages = $dom->getElementsByTagName('img');
echo $allImages->length, PHP_EOL;
这将打印3,因为现在DOM中有3个img
元素。
让我们用img
元素替换第一个p
元素:
$allImages->item(0)->parentNode->replaceChild(
$dom->createElement("p"),
$allImages->item(0)
);
echo $allImages->length, PHP_EOL;
现在这给了2,因为现在只剩下2 img
个元素,基本上是
item 0: img will be removed from the list
item 1: img will become item 0
item 2: img will become item 1
您正在使用foreach
,因此您首先替换项目0,然后转到项目1,但项目1现在是项目2,项目0是您期望的下一项目1。但由于列表是实时的,你正在跳过它。
要解决此问题,请使用while
循环并始终替换第一个元素:
while ($allImages->length > 0) {
$allImages->item(0)->parentNode->replaceChild(
$dom->createElement("p"),
$allImages->item(0)
);
}
然后会捕获所有img
元素。