2009-10-02 220 views
0

如何提取從HTML文件如何使用PHP從HTML文件中提取所有文本?

所有文字我想提取所有文字,在ALT屬性,< p>標籤等。

但是我不想提取風格之間的文本和腳本標籤

感謝

現在我有以下代碼

<?PHP 
    $string = trim(clean(strtolower(strip_tags($html_content)))); 
    $arr = explode(" ", $string); 
    $count = array_count_values($arr); 
    foreach($count as $value => $freq) { 
      echo trim ($value)."---".$freq."<br>"; 
    } 

    function clean($in){ 
      return preg_replace("/[^a-z]+/i", " ", $in); 
    } 

    ?> 

這很好,但它檢索腳本和樣式標籤,我不想檢索 和另一個問題,我不確定它是否確實檢索屬性,如ALT - 因爲strip_tags函數可能會刪除所有具有其屬性的HTML標記

謝謝

+0

使用正則表達式來查找您的內容,而不是將其用於清理。 – jantimon 2009-10-02 08:16:35

+0

您是否有要從中提取文本的標籤和屬性的「白名單」,或者您不想從中提取文本的標籤/屬性的「黑名單」? – VolkerK 2009-10-02 08:27:42

+0

@Ghommey:謝謝我正在嘗試,但它對我來說太難了 – ahmed 2009-10-02 08:40:36

回答

0

首先刪除完整內容的腳本和樣式標籤,然後使用您當前的清潔標籤方式,您將獲得文本。

7

我個人認爲你應該切換到某種XML讀取器(SimpleXML,Document Object ModelXMLReader)來解析HTML文檔。我會去的DOMSimpleXMLXPath混合提取你所需要的 - 解析任意文檔時寄託都否則就會失敗:

$dom = new DOMDocument(); 
$dom->loadHTML($html_content); // use DOMDocument because it can load HTML 
$xml = simplexml_import_dom($dom); // switch to SimpleXML because it's easier to use. 
$pTags = $xml->xpath('/html/body//p'); 
$tagsWithAltAttribute = $xml->xpath('/html/body//*[@alt]'); 
// ... 
+0

我也會去這個解決方案。然而,如果HTML內容本身無效(破壞了標籤等),它會中斷。 – rubayeet 2009-10-02 08:33:08

+0

你是對的 - 但使用字符串和正則表達式函數構建一個解析器,可以處理任意和可能格式錯誤或無效的文檔要複雜得多。 一種解決方案是在將HTML字符串傳遞給XML閱讀器之前,通過HTML Tidy(http://de3.php.net/manual/en/book.tidy.php)運行HTML字符串。 如果OP將解析着名的結構化HTML(相同的結構所有tim),他應該可能去正則表達式解決方案。 – 2009-10-02 08:42:17

+0

@Stefan Gehrig:謝謝這樣可以正常工作,但我會盡力知道如何獲取所有文本,而不僅僅是「alt」 - 它比正則表達式更容易和更安全 – ahmed 2009-10-02 08:47:55

0

首先,你可以搜索和塊,並從HTML中刪除。

我有這個功能,我使用了很多

 function search($start,$end,$string, $borders=true){ 
      $reg="!".preg_quote($start)."(.*?)".preg_quote($end)."!is"; 
      preg_match_all($reg,$string,$matches); 

      if($borders) return $matches[0];  
      else return $matches[1];  
     } 

的功能將在數組中返回的匹配塊。

$array = search("<script>" , "</script>" , $html) 

一旦你的腳本和風格了,使用用strip_tags來獲取文本

+0

這不會工作,除非你的腳本和樣式標籤使用95%的類型屬性。 – 2009-10-02 08:39:29

+0

這是一個例子,你可以使用搜索(「」,$ html) – 2009-10-02 08:40:31

0

任何一種分析是不是一種選擇,只要你不能確定來源是100%良好形成了XML(根據定義,HTML4不是)。

一個簡單的preg_replace就足夠了。類似於

preg_replace('/<(script|style).*>.*<\/\1>/i', '', $html); 

應該足以用空字符串替換所有腳本和樣式元素及其內容(即剝離它們)。

但是,如果您想避免XSS攻擊,那麼最好使用HTML sanitiser來規範化HTML,然後去掉所有錯誤的代碼。

0

我張貼這作爲一個答案到另一個職位,但這裏要再次重申:

我們剛剛在repustate.com推出了新的自然語言處理API了。使用REST API(所以只需使用curl就可以),你可以清理任何HTML或PDF,然後只取回文本部分。我們的API是免費的,因此可隨意使用您的內容。檢查一下,並將結果與​​readability.js進行比較 - 我想你會發現它們幾乎是100%相同。

相關問題