不自重者,取辱。不自长者,取祸。不自满者,受益。不自足者,博闻。
PHP富文本解析-自动生成摘要 进入全屏
line

   空间买下来已近很久了,一直没有时间来倒腾,这两天抽空来倒腾这个个人博客,从前端到后端,统统设计再实现一遍-_-!工作量确实还是不小的!


   前端那点儿东西,实现起来倒是没有什么障碍,就是日常工作中用到的Smarty3+HTML+Javascript+CSS。


   始终不是纯搞后端的,这个得承认,写了一篇文章,入库之前,需要先生成摘要,于是,这个摘要该怎么生成?算法怎么写?

一开始图省事儿,就网上随便找了一段PHP版本的摘要自动生成代码,贴过来以后发现各种BUG,生成出来的摘要简直没法用。

   没放弃,继续又找了好几个,效果都非常差,实在忍不住了!!!


   分析一下,摘要的生成,重点就是:

       1、不能简单的进行strip_tags处理,这样的摘要显示出来无格式,阅读体验很差

       2、不能简单的进行substring处理,这样会造成一些标签不能正确闭合,影响页面布局

   

   综合这两点来考虑,其实就没那么复杂了,只需要对富文本源码进行一次HTML词法分析,然后对分析结果进行逐一处理,最后根据具体的长度限制,将结果拼接起来,将未闭合的标签都闭合掉,就可以了。

   

   东西,还是用自家的习惯。咱银总搞的FCP功能很强大,Fl就能够实现这个词法分析的功能,要生成摘要,只需要稍加处理。


   改造后的Fl,生成摘要的核心算法,代码如下:

/**
 * 生成摘要
 * @param  string  $content='' 富文本内容源码
 * @param  integer $length=3000 摘要字数限制
 * @return [type]
 */
public function generateDigest($content='',$length=3000) {
    // 实例化Fl
    $flInstance = self::getInstance();
    // HTML词法分析
    $analyticResult = $flInstance->analytic_html($content);
 
    $result = '';
    $htmlTagStack = array();
 
    // 遍历词法分析的结果
    foreach ($analyticResult as $key => $item) {
        // 分析单个标签
        $tagAttr = $flInstance->analytic_html($item[0],2);
 
        // 开始标签,如:<p>、<div id="xx">
        if($item[1] == FL::HTML_TAG_START) {
            // 将不能自动闭合的标签压栈
            if(!$flInstance->analytic_html($tagAttr[1],4)) {
                $htmlTagStack[] = $tagAttr[1];
            }
        }
        // 结束标签
        elseif($item[1] == FL::HTML_TAG_END) {
            // 当前结束标签和栈顶的标签相同,则出栈该标签
            if($tagAttr[1] == $htmlTagStack[count($htmlTagStack) - 1]) {
                array_pop($htmlTagStack);
            }
        }
 
        // 拼接摘要
        $result .= $item[0];
 
        // 字数控制
        if(strlen($result) >= $length) {
            break;
        }
    }
 
    // 将没有闭合的标签,都闭合起来
    for ($i=count($htmlTagStack) - 1; $i >= 0 ; $i--) { 
        $result .= ('</' . $htmlTagStack[$i] . '>');
    }
 
    // 生成最终摘要
    return $result;
}


   看注释吧,代码其实很简单,整个demo上来,demo里,这样调用:

/**
 * 生成摘要
 * @param  string  $content='' 富文本源码
 * @param  integer $length=3000 摘要字数,默认是3000字,包括标签在内
 * @return [type]
 */
function generateDigest($content='',$length=3000) {
    // 引入Fl
    require_once('Fl/Fl.class.php');
    // 获取实例
    $flInstance = Fl::getInstance();
 
    // 获取摘要
    return $flInstance->generateDigest($content,$length);
}


   开源代码:http://alienfe.com/upload/84931338911323.rar


   等后续功能需要强化了,再继续升级,不过,现在这样已经够用了!    

趣店(原趣分期)技术学院
重点关注技术架构、服务化、优秀工具、自动化平台、开发全流程一体化解决方案、新人培养、工程师进阶之道等方面
这里环境优雅、氛围年轻、主要是福利还多,还等什么?我们敞开技术的大门,欢迎各种工程师加入!

评论区域

line
  • 测试 2017-07-15 10:49:47 回复
    0
  • 测试 2017-07-15 10:49:26 回复
    回复 测试 : ..
    测试 said:
    回复 下载不了了 : 00
  • 测试 2017-07-15 10:42:57 回复
    回复 下载不了了 : 00
    下载不了了 said:
    原来换了域名 搞定了 但是只能截取一段 不算摘要
  • 测试 2017-07-15 10:42:34 回复
    回复 测试 : 000
  • 测试 2017-07-15 10:42:11 回复
    回复 下载不了了 : 00
    下载不了了 said:
    下载不了了
  • 测试 2017-07-15 10:40:14 回复
    回复 测试 : 0
    测试 said:
    回复 下载不了了 : .
  • 测试 2017-07-15 10:39:49 回复
    回复 下载不了了 : .
  • 下载不了了 2016-12-27 17:22:34 回复
    原来换了域名 搞定了 但是只能截取一段 不算摘要
  • 下载不了了 2016-12-27 16:05:19 回复
    下载不了了