2015-12-29 118 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