php自动生成文章摘要

piaoling  2011-01-30 07:40:40

在做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;
} 

类别 :  PHP(78)  |  浏览(3791)  |  评论(0)
发表评论(评论将通过邮件发给作者):

Email: