2012-03-11 28 views
1

希望這是可能的簡單的HTML DOM,我刮的網頁看起來像這樣:用PHP Simple Html Dom獲取不同類型的前一個元素?

<h5>this is title 1</h5> 
<img> 
<img> 
<img> 

<h5>this is title 2</h5> 
<img> 
<img> 

<h5>this is title 3</h5> 
<img> 
<img> 
<img> 
<img> 

等等

我試圖讓它看起來像:

<h5>this is title 1</h5> 
<img> 
<h5>this is title 1</h5> 
<img> 
<h5>this is title 1</h5> 
<img> 


<h5>this is title 2</h5> 
<img> 
<h5>this is title 2</h5> 
<img> 

這意味着每個IMG我需要找到並抓住第一個先前的H5,我想。有沒有父母的div或任何結構使它更容易,這幾乎是我描述它。

我使用看起來像這樣(簡化)代碼:在非調用一個成員函數prev_sibling():

foreach($html->find('img') as $image){ 

//do stuff to the img 

$title = $html->find('h5')->prev_sibling(); 


echo $title; echo $image;} 

一切我已經與prev_sibling試圖讓我一個「致命錯誤 - 對象「,我想知道我想要做什麼,甚至可能與PHP簡單的HTML Dom。我希望如此,我試過的所有其他刮刀都讓我把頭髮拉出來。

回答

1

基本上,您要選擇所有h5元素以及所有img元素。然後,你通過它們循環,並檢查它們的類型。如果它是h5元素,則更新$title變量,但不要echo任何內容。如果是img,則只需在圖像前回顯$title即可。既然您已經緩存了h5,現在不需要去尋找。

下面是一個例子:

foreach ($html->find('h5, img') as $el) 
{ 
    if ($el->tag == 'h5') 
    { 
     $title = $el->plaintext; 
     continue; 
    } 

    echo "<h5>$title</h5>"; 
    echo $el->outertext; 
} 
+0

這幾乎做到了,謝謝!現在我必須弄清楚如何從圖像中獲得'alt',但我希望這不應該太難。 – jthomasbailey 2012-03-11 22:23:56

+0

@jthomasbailey - 使用這個:'if(isset($ el-> alt))$ alt = $ el-> alt;' – 2012-03-11 22:25:30

+0

太棒了!謝謝! – jthomasbailey 2012-03-11 22:39:47

2

是的,因爲您沒有將整個頁面加載爲dom,所以您實際上擁有的是DOMElement的列表,並且以前的子項將爲NULL。

,而非先前所找到的,你基本上可以做的是,有一個移動指針

$all = get all elements, 
$title = null; 
foreach ($all as $e) { 
    if ($e == "h5") { 
    $title = $e; 
    continue; 
    } 
    echo $title . $e; 
} 

有一些停放的代碼,但你會明白我的意思。