2011-06-22 217 views
3

如何刪除除PHP第一個之外的所有li元素?刪除除PHP第一個之外的所有列表元素?

<div class="category"> 
    <ul class="products"> 
    <li>{nested child elements}</li> 
    <li>{nested child elements}</li> 
    <li>{nested child elements}</li> 
    </ul> 
</div> 

上面的代碼是由另一個腳本通過函數生成的。

結果應該是這樣的:

<div class="category"> 
    <ul class="products"> 
     <li>{nested child elements}</li> 
    </ul> 
</div> 

UPDATE:對不起球員的 「類別」 是一個類不是一個ID。

爲了回報Yoshi,ul.products有兄弟姐妹,但我沒有把它們包含在我的文章中。這會影響查詢嗎?

這是我的代碼看起來像Yoshi的代碼添加:

class Myclass { 
    function prin_html() { 
     $content = get_code(); 
     $dom = new DOMDocument; 
     $dom->loadXml($content); 

     $xpath = new DOMXPath($dom); 
     foreach ($xpath->query('//li[position()>1]') as $liNode) { 
      $liNode->parentNode->removeChild($liNode); 
     } 

     echo $dom->saveXml($dom->documentElement);  
    } 
} 

它窗臺打印未過濾的HTML代碼...

+0

PHP還是JavaScript/jQuery? – NAVEED

+0

我希望它在PHP中... – jilseego

+1

你是否以編程方式生成這個輸出? – phant0m

回答

9

嘗試:

$dom = new DOMDocument; 
$dom->loadHtml('<div id="category"> 
    <ul class="products"> 
    <li>{nested child elements}</li> 
    <li>{nested child elements}</li> 
    <li>{nested child elements}</li> 
    </ul> 
</div>'); 

$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//li[position()>1]') as $liNode) { 
    $liNode->parentNode->removeChild($liNode); 
} 

$output = ''; 
foreach ($xpath->query('//body/*') as $child) { 
    $output .= $dom->saveXml($child); 
} 

輸出:

<div id="category"> 
    <ul class="products"> 
    <li>{nested child elements}</li> 


    </ul> 
</div> 
+0

試過了,沒有工作... – jilseego

+0

@jilseego它在我給出的例子中工作。如果它不適合你,那麼你可能會有格式錯誤的HTML開始。請提供更詳細的信息/您的數據的例子。 – Yoshi

+0

@Yhoshi:ul有兄弟姐妹,會影響查詢嗎? – jilseego

2

你可以使用DOMDocument。

$dom = new DOMDocument; 

$dom->loadHTML($html); 

$ul = $dom->getElementById('category')->getElementsByTagName('ul')->item(0); 

foreach($ul->getElementsByTagName('li') as $index => $li) { 
    if ($index == 0) { 
     continue; 
    } 
    $ul->removeChild($li); 
} 
相關問題