2014-11-23 63 views
0

我有下面的代碼....PHP - 獲取從一個元素中的鏈接元素已被發現後

<div class="outer"> 
<div> 
<h1>Christmas</h1> 
<ul> 
    <li>Holiday</li> 
    <li>Fun</li> 
    <li>Joy</li> 
</ul> 
<h1>4th July</h1> 
<ul> 
    <li>Fireworks</li> 
    <li>Happy</li> 
    <li>Spectral</li> 
</ul> 
</div> 
</div> 
<div class="outer"> 
<div> 
<h1>Christmas2</h1> 
<ul> 
    <li>Holiday</li> 
    <li>Fun</li> 
    <li>Joy</li> 
</ul> 
<h1>4th July</h1> 
<ul> 
    <li>Fireworks2</li> 
    <li>Happy</li> 
    <li>Spectral</li> 
</ul> 
</div> 
</div> 

我已經知道我能找到的DIV,然後看看DIV的元素中通過這樣做等...

$doc->loadHTML($output); //$output being the text above 
$xpath = new DOMXpath($doc); 
$elements = $xpath->query('//div[@class="outer"]'); //Check outer 

我知道這上面的3線將從DIV中列出獲得的元素,但我真的希望能夠做的就是在[H1]的文字,然後顯示每個H1旁邊的[li]值..

輸出我要找的是...

Christmas - Holiday, Fun, Joy 
4th July - Fireworks, Happy, Spectral 
Christmas2 - Holiday, Fun, Joy 
4th July2 - Fireworks, Happy, Spectral 
+0

顯示你已經嘗試了什麼......我看到在試圖解決您的問題沒有力氣。你在做什麼是要求答案,沒有幫助。 – ElefantPhace 2014-11-23 06:09:06

回答

1

是您可以繼續使用xpath遍歷標題上的元素並獲取其後續的兄弟,即列表。例如:

$doc = new DOMDocument(); 
$doc->loadHTML($output); 
$xpath = new DOMXpath($doc); 
$elements = $xpath->query('//div[@class="outer"]/div'); 
if($elements->length > 0) { 
    foreach($elements as $div) { 
     foreach ($xpath->query('./h1', $div) as $e) { 
      $header = $e->nodeValue; 
      $list = array(); 
      foreach ($xpath->query('./following-sibling::ul/li', $e) as $li) { 

       $list[] = $li->nodeValue; 
      } 

      echo $header . ' - ' . implode(', ', $list) . '<br/>'; 
     } 
     echo '<hr/>'; 
    } 
} 

Sample Output

+0

Ghost我必須對我的請求進行更改,因爲我認爲如果我修改它,它仍然可以正常工作,但由於某些原因,它不起作用,請幫助修改後的版本。 – eqiz 2014-11-23 06:05:27

+0

@MattHam如果是這樣的話,那麼只需修改第一個查詢,因爲它有另一個div在'$ elements = $ xpath-> query('// div [@ class =「outer」]/div [@ class =「內心「]');' – Ghost 2014-11-23 06:07:04

+0

你100%的權利,但我的意思是沒有一個班上那個是我的意思...我想如果我有基礎知識,我將能夠理解和修改你的代碼,因爲我來自ASP.NET,但顯然我不如我想象的那麼好。以上完全是我試圖理解如何從中提取數據的結構。一百萬感謝 – eqiz 2014-11-23 06:10:52

0

我已經在過去使用phpQuery這種類型的問題:

// include phpquery 
require('phpQuery/phpQuery.php'); 
// initialize 
$doc = phpQuery::newDocumentHTML($markup); 
// get the text from the various elements 
$h1Value = $doc['h1:first']->text(); // Christmas 
// ... etc. 

(未經測試)