2013-01-31 62 views
1

我目前使用PHPCrawler進行網站上的某些搜索功能。我需要刪除一些頁面元素被索引。如何使用PHPCrawler刪除某些標籤和內容

例如,我用:

$doc_body = preg_replace('/<li>(.*?)<\/li>/is', "", $doc_body); 

刪除列表,因爲我不想在結果列表中。這完全按照它應該的方式工作。現在

,還有一點我需要刪除如下:

<div class="example">all contents within</div> 

所以爲了這個,我曾嘗試:

$doc_body = preg_replace('/<div(.*?)class="(.*?)example(.*?)"(.*?)>(.*?)<\/div>/is', "", $doc_body); 

因爲也許不是每個頁面都有股利類產生一個錯誤例。 所以我用下面的代碼將它改編:

 if(strpos($doc_body,'<div class="example">')){ 
     $doc_body = preg_replace('/<div(.*?)class="(.*?)example(.*?)"(.*?)>(.*?)<\/div>/is', "", $doc_body); 
     } 

不幸也不管用!它不會產生錯誤,但不會刪除結果中的所有內容。

這是我第一次使用phpcrawler或Domdocument ......雖然我不確定這裏的問題與他們有什麼關係?

回答

1

我建議你看看DOMDocumentXPath這是用來查詢文件模型很像CSS,但語法有點不同。 W3School在XPath here上有一個輕量級的教程。

正則表達式在解析整個文檔時總是一個壞主意,因爲它既耗資又耗時。

例如,要使用XPath找到類「示例」的每個div,您只需查詢該文檔;

//div[@class="example"] 

然後與DOMDocument API刪除節點和最終正常化,才能得到最終結果。

$doc = new DOMDocument(); 
$xpath = new DOMXPath($doc); 
$doc->loadHTML($html); 

// Remove all the lists 
foreach ($xpath->query("//ul | //ol") as $node) { 
    $node->parentNode->removeChild($node); 
} 

// Remove all <div class="example" /> nodes 
foreach ($xpath->query("//div[@class='example']") as $node) { 
    $node->parentNode->removeChild($node); 
} 

$doc->normalize(); 

// Get the final document for indexing 
$html = $doc->saveHTML(); 
+1

很好的答案......感謝您指點我在正確的方向。下面的發生是我的問題的具體解決方案,但熟悉xpath是要走的路:'foreach($ xpath-> query(「// div [@ class ='example']」)as $ node) {\t \t $ node-> parentNode-> removeChild($ node);' – absentx

+0

是的,對不起。自從我實現了DOMDocument以來已經有一段時間了。我已經更新了我的答案。 – Daniel

相關問題