PHP版自动生成文章摘要


Posted in PHP onJuly 23, 2008

自动生成文章摘要[JavaScript 版本]。
我们在写BLOG这样的程序时经常需要显示文章前一部分的,但是又怕不恰当的截断破坏封闭标签以造成整
个文档结构破坏,使用我的函数可以在要求不高的情况下解决这个问题。

大家应该考虑这个函数在服务端应用还是在客户端应用。因为我考虑这个函数可能运行起来比较费机器,
所以安全性要求不高的情况下可以放在客户端上。

最好数据表中单独一个字段放这个摘要,这样相应的数据库查询也优化了。牺牲一点点空间换很多时间还
是划算的。

再聊一下安全性问题,主要是内容安全性。如果客户端意图更改正常的摘要信息的话,一般都是BLOG的主
人才有这个权力,那么他使得摘要和原文的一致性破坏就是他自己的事了。内容以外的安全性都可以在服
务端解决。所以还是推荐在客户端使用本函数。

核心代码:
最近应用了一下,发现上面的函数对多字节字符集支持得不好,因此重写了一下。

如果遇到问题,不妨试试下面的函数。

function Generate_Brief($text){
    global $Briefing_Length;
    mb_regex_encoding("UTF-8");
    if(mb_strlen($text) <= BRIEF_LENGTH ) return $text;    
    $Foremost = mb_substr($text, 0, BRIEF_LENGTH);
    $re = "<(\/?)
(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)[^>]*(>?)";
    $Single = "/BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT|BR/i";    

    $Stack = array(); $posStack = array();

    mb_ereg_search_init($Foremost, $re, 'i');

    while($pos = mb_ereg_search_pos()){
        $match = mb_ereg_search_getregs();
        /*    [Child-matching Formulation]:

            $matche[1] : A "/" charactor indicating whether current "<...>" Friction is 
Closing Part
            $matche[2] : Element Name.
            $matche[3] : Right > of a "<...>" Friction    
        */
        if($match[1]==""){
            $Elem = $match[2];
            if(mb_eregi($Single, $Elem) && $match[3] !=""){
                continue;
            }
            array_push($Stack, mb_strtoupper($Elem));
            array_push($posStack, $pos[0]);            
        }else{
            $StackTop = $Stack[count($Stack)-1];
            $End = mb_strtoupper($match[2]);
            if(strcasecmp($StackTop,$End)==0){
                array_pop($Stack);
                array_pop($posStack);
                if($match[3] ==""){
                    $Foremost = $Foremost.">";
                }
            }
        }
    }

    $cutpos = array_shift($posStack) - 1;    
    $Foremost =  mb_substr($Foremost,0,$cutpos,"UTF-8");
    return $Foremost;
};欢迎大家找错误。谢谢。

PHP 相关文章推荐
一个目录遍历函数
Oct 09 PHP
桌面中心(二)数据库写入
Oct 09 PHP
用PHP实现多级树型菜单
Oct 09 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
Sep 30 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
PHP滚动日志的代码实现
Jun 10 PHP
PHP中遇到的时区问题解决方法
Jul 23 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
Jun 08 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 PHP
php array_merge下进行数组合并的代码
Jul 22 #PHP
用php过滤危险html代码的函数
Jul 22 #PHP
php socket方式提交的post详解
Jul 19 #PHP
php minixml详解
Jul 19 #PHP
php正则校验用户名介绍
Jul 19 #PHP
PHP批量生成缩略图的代码
Jul 19 #PHP
Discuz 模板引擎的封装类代码
Jul 18 #PHP
You might like
discuz7 phpMysql操作类
2009/06/21 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
如何使用php输出时间格式
2013/08/31 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
js加强的经典分页实例
2013/03/15 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
pytorch中图像的数据格式实例
2020/02/11 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
重大事项社会稳定风险评估方案
2014/06/15 职场文书
项目投资合作意向书
2014/07/29 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
通知格式
2015/04/27 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
酒店开业主持词
2015/07/02 职场文书
公司管理制度范本
2015/08/03 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
python中取整数的几种方法
2021/11/07 Python