2015-12-29 97 views
1

我想取代我的HTML,但代码中所有图片更换一个和逃避一个等DOM文档用PHP

我使用DOM文档,以取代我的内容图像和我用下一个代码问题是代码图像逸出 例如

1 2 3 4图像的代码替换一个和三个和避开丝束和四等

see the result on action

$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>&nbsp;</p> 
<p>some text</p> 
<p>&nbsp;</p> 
<p><img class="img-responsive" src="http://40.media.tumblr.com/c0bc20fd255cc18dca150640a25e13ef/tumblr_nammr75ACv1taqt2oo1_500.jpg" alt="" width="480" height="477" /></p> 
<p>&nbsp;</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

你能否澄清你问题中的确切问题? – Epodax

+1

您显示的代码创建了一个元素名称“newimg”。这不是一个有效的html元素。你能显示一段输入html和所需的输出html吗?您的图片和说明并不能帮助我理解问题。 – Gordon

+0

@Gordon 我想输出HTML一个 – Roufail

回答

1

OK更换所有图像,我无法找到适合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,因为是在3种img元素DOM现在。

让我们从一个p元素替换第一img元素:

​​

现在,这给了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元素。

+1

工作就像一个魅力你救了我的一天和很好的解释谢谢 – Roufail