从PHP中获取HTML摘录

时间:2009-11-20 15:56:28

标签: php html

我需要获得用HTML编写的新闻项目的简短摘录,以便在我的首页上显示。显然,我不能使用像substr这样简单的东西,因为它可能会使标签保持未封闭状态,甚至可以留下半个标签。

哪个更容易:

  • 将HTML转换为体面的纯文本,并将其中的一部分
  • 从HTML开始并在截止点关闭所有未关闭的标签(这总是看起来不错吗?)

我将如何实施所选择的解决方案?

6 个答案:

答案 0 :(得分:7)

最简单的方法是在截断之前使用strip_tags()从项目文本中删除所有HTML。

答案 1 :(得分:3)

如果保留原始新闻项的HTML结构很重要,我会选择第二个选项。

实现此功能的一种简单方法是通过Tidy运行您的片段以关闭所有未关闭的标记。特别是,请参阅tidy::cleanRepair方法。

答案 2 :(得分:2)

你好我想你要找的是网站抓取。 以下是如何抓取网站的方法; 使用库PHP Simple HTML DOM Parser在这里下载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); 

答案 3 :(得分:1)

您可以尝试将数据解析为XML,然后仅截断“纯”文本节点。

注意:此解决方案强制输入为有效的XML,并始终保持大致相同的结构。

答案 4 :(得分:0)

这摘录到第一段而没有剪切单词并添加可选的跟踪。

$ excerpt = self :: 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;
}
//

答案 5 :(得分:0)

有时候,最好将前两段与带有组和惰性量词的正则表达式结合使用。

function excerpt_from_html($str) {
    $re = '/(<p>\X*?<\/p>)\X*?(<p>\X*?<\/p>)/u';
    preg_match($re, $str, $matches);
    return $matches[1] . $matches[2];
}

或者您可以采用3-4段,并根据摘录的长度决定要显示多少段。