2009-11-20 58 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; 
} 
//