2009-11-20 60 views
3

我需要獲取用HTML編寫的新聞項目的簡短摘錄以顯示在我的首頁上。很明顯,我不能使用像substr這樣簡單的東西,因爲它可能會使標籤不封閉甚至留下一半標籤。從PHP中獲取摘錄來自HTML

,哪一樣容易:

  • 的HTML轉換爲體面尋找純文本,並拿出一張該
  • 從HTML以開始和截止關閉所有未關閉的標籤(將這個總是看好吧?)

我將如何去執行選擇的解決方案?

+0

第三種方法是解析HTML,對於[例如用DOM文檔它接受標籤的護理](HTTP:// stackoverflow.com/a/29323396/367456)。 – hakre 2015-03-28 23:02:29

回答

6

最簡單的方法是在截斷它之前使用strip_tags()從項目文本中去除所有HTML。

+0

現在將其用於自動生成的摘錄。這不是最好的,但沒關係,因爲我爲新聞海報提供了特殊標記以指定他們自己的摘錄。 – 2009-11-21 01:30:49

3

如果重要的是保留原始新聞項目的HTML結構,我會採取第二種選擇。

一個簡單的方法來實現這將是通過Tidy運行你的片段關閉任何未封閉的標籤。具體請參閱tidy::cleanRepair方法。

1

您可以嘗試將數據解析爲XML,然後僅截斷「純」文本節點。

注意:此解決方案強制輸入爲有效的XML並始終處於大致相同的結構中。

2

你好我猜你在找什麼叫網站抓取。 這裏是你如何刮網站; 使用庫PHP簡單的HTML DOM解析器在這裏下載PHP Simple HTML DOM Parser

最後這裏是代碼,你可以怎麼刮Slashdot的

// Create DOM from URL 
$html = file_get_html('http://slashdot.org/'); 

// Find all article blocks 
foreach($html->find('div.article') as $article) { 
    $item['title'] = $article->find('div.title', 0)->plaintext; 
    $item['intro'] = $article->find('div.intro', 0)->plaintext; 
    $item['details'] = $article->find('div.details', 0)->plaintext; 
    $articles[] = $item; 
} 

print_r($articles); 
+0

在這種情況下不使用此功能,但有幫助。 – 2009-11-21 01:31:23

0

此摘錄下來第一款不割字和附加可選的蹤跡。

$摘錄自= :: excerpt_paragraph($ HTML,180)

/** 
* excerpt first paragraph from html content 
* 
**/ 
public static function excerpt_paragraph($html, $max_char = 100, $trail='...') 
{ 
    // temp var to capture the p tag(s) 
    $matches= array(); 
    if (preg_match('/<p>[^>]+<\/p>/', $html, $matches)) 
    { 
     // found <p></p> 
     $p = strip_tags($matches[0]); 
    } else { 
     $p = strip_tags($html); 
    } 
    //shorten without cutting words 
    $p = self::short_str($p, $max_char); 

    // remove trailing comma, full stop, colon, semicolon, 'a', 'A', space 
    $p = rtrim($p, ',.;: aA'); 

    // return nothing if just spaces or too short 
    if (ctype_space($p) || $p=='' || strlen($p)<10) { return ''; } 

    return '<p>'.$p.$trail.'</p>'; 
} 
// 

/** 
* shorten string but not cut words 
* 
**/ 
public static function short_str($str, $len, $cut = false) 
{ 
    if (strlen($str) <= $len) { return $str; } 
    $string = ($cut ? substr($str, 0, $len) : substr($str, 0, strrpos(substr($str, 0, $len), ' '))); 
    return $string; 
} 
//