我需要获得用HTML编写的新闻项目的简短摘录,以便在我的首页上显示。显然,我不能使用像substr
这样简单的东西,因为它可能会使标签保持未封闭状态,甚至可以留下半个标签。
哪个更容易:
我将如何实施所选择的解决方案?
答案 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段,并根据摘录的长度决定要显示多少段。