php自动生成文章摘要
在做blog的时候,首页一般都会显示一些摘要信息,以便浏览者快速查看文章,决定是否阅读。
最开始的时候,我使用的是字符串截取的方式来实现的。
但发现,如果只是单纯的通过字符串截取来生成摘要,通常会导致HTML标签的不匹配,
进而导致页面的结构混乱,影响网页的样式。
google了一下,然后写了个自用的。
但是,现在只是单纯的补出不足的标签,如果正好截取到标签的一部分,并没有自动补全标签。
今天有点晚了,这个功能在周末来实现吧。
//文章摘要截取
function get_article_summary($content,$start,$length){
if (strlen($content) <= $length){//mb_strlen
return $content;
}else {
//载入栈类
$stack = YU::getSingleton('helper_stack');
//获取内容
$content = utf8_substr($content,$start,$length);
//匹配标签
$reg = '/<(/?)(P|DIV|H1|H2|H3|H4|H5|H6|
ADDRESS|PRE|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|
OBJECT|A|UL|OL|LI|BASE|META|LINK|HR|BR|PARAM|IMG|AREA|
INPUT|SPAN)(.*)>/i';
$single = "/BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|BR/i";
preg_match_all($reg,$content,$matchs);
$pos = 1;
foreach ($matchs[2] as $element){
$element = strtoupper($element);
if (!empty($element) && empty($matchs[1][$pos])){
//如果是不需要结束的标签,则不需入栈
if (preg_match($single,$element)){ continue; }
//如果是开始标记<>,则入栈
$stack->push($element);
}else if ($matchs[1][$pos]=='/' && $stack->get_top() == $element){
//如果是结束标记,则出栈
$stack->pop();
}
$pos++;
}
//如果不匹配,则自动补全
$adds = $stack->get_stack();
//print_r($adds);exit;
foreach ($adds as $key=>$add){
$adds[$key] = '</'.$add.'>';
}
$adds = implode(' ',$adds);
$content .= $adds;
//清空栈
$stack->clear();
}
return $content;
}