2012-11-09 72 views
-2

我想刪除一些DIV ID爲或包含單詞類commentshare(如:<div id="comment"><div class="header-comment"><div id="comment-footer"><div class="social-share">),這是我用PHP正則表達式中刪除一些不需要的div

preg_replace('/<div[^>]*(comment|share)[^>]*>(.*?)<\/div>/is', '', $htmls); 

不起作用。如何做一個正確的正則表達式?下面是一些測試代碼,我想刪除comment部分,並保持contentfooter

$htmls = <<<EOT 
<div id="content"> 
    Main content. 
</div> 
<div id="comment"> 
    <ul> 
     <li class="comment"> 
      <div class="header-comment"> 
       Comment: 
       <span class="date-comment">8/11/2012, 21:25</span> 
      </div> 
      <h4>Some Text</h4> 
      <p class="test-comment">Blah~~ Blah~~ Blah~~</p> 
      <div class="share"> 
       <div class="vote"> 
        <a class="vota yes" title="Like">2</a> 
        <a class="vota no" title="Unlike">0</a> 
       </div> 
      </div> 
     </li> 
     <li class="comment"> 
      <div class="header-comment"> 
       Comment: 
       <span class="date-comment">8/11/2012, 23:08</span> 
      </div> 
      <h4>Other Text</h4> 
      <p class="test-comment">Blah~~ Blah~~ Blah~~</p> 
      <div class="share"> 
       <div class="vote"> 
        <a class="vota yes" title="Like">4</a> 
        <a class="vota no" title="Unlike">0</a> 
       </div> 
      </div> 
     </li>  
    </ul> 
</div> 
<div id="footer"> 
    Footer content. 
</div> 
EOT; 

$htmls = preg_replace('/<div[^>]*(comment|share)[^>]*>(.*?)<\/div>/is', '', $htmls); 
echo $htmls; 
+2

[小心使用正則表達式解析HTML的,順便邪神要你。(http://stackoverflow.com/questions/1732348/正則表達式匹配打開標籤,除了xhtml自包含標籤/ 1732454#1732454) – rid

+0

每當你嘗試用正則表達式解析HTML時,一個小海豹會被殺死。 – moonwave99

+1

Html不是一種常規的語言,因此使用正則表達式來解析它是非常困難的。 http://en.wikipedia.org/wiki/Regular_language –

回答

1

什麼,我認爲你應該使用是DomDocument嘗試:

$dom = new DOMDocument(); 
$dom->loadHTML($htmls); 
$remove = array("comment","share"); 
$removeList = array(); 
foreach ($dom->getElementsByTagName("div") as $div) { 
    if (in_array($div->getAttribute("class"), $remove) || in_array($div->getAttribute("id"), $remove)) { 
     $removeList[] = $div; 
    } 
} 

foreach ($removeList as $div) { 
    $div->parentNode->removeChild($div); 
} 

$dom->formatOutput = true; 
echo "<pre>"; 
echo htmlentities($dom->saveHTML()); 
+0

所以如果div這樣的div:'div.header-comment','div.social-share',我應該在'$ remove = array(「comment 」,‘共享’,‘頭註釋’,‘社會共享’);'?這是很累,列出所有的數組。 –

+0

@fish man ..是的,就像那樣簡單 – Baba

+0

是否可以用'strpos'來代替'in_array'?如果在id或class中找到'comment'或'share',請刪除div? –

2

考慮使用DOMDocument功能來解析HTML,然後針對div你不想和remove它。這會更快,更容易理解和維護,並且可能寫得更快。