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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
php xfocus防注入资料
Apr 27 PHP
PHP 最大运行时间 max_execution_time修改方法
Mar 08 PHP
PHP中实现汉字转区位码应用源码实例解析
Jun 14 PHP
PHP之数组学习
May 29 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
PHP的password_hash()使用实例
Mar 17 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
php上传图片并压缩的实现方法
Dec 22 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
Apr 15 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
封装一个PDO数据库操作类代码
2009/09/09 PHP
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
jquery选择器简述
2015/08/31 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
python实现爬虫下载美女图片
2015/07/14 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
python游戏开发的五个案例分享
2020/03/09 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
详解Python中的文件操作
2021/01/14 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
2019年Java 最常见的 面试题
2016/10/19 面试题
linux面试题参考答案(5)
2016/11/05 面试题
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
毕业生就业自荐信
2013/12/04 职场文书
高中毕业生生活的自我评价
2013/12/08 职场文书
中级会计职业生涯规划范文
2014/01/16 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
学习张林森心得体会
2014/09/10 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
教你nginx跳转配置的四种方式
2022/07/07 Servers