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 相关文章推荐
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
Dec 13 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
php自定义加密与解密程序实例
Dec 31 PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 PHP
PHP处理会话函数大总结
Aug 05 PHP
win10环境PHP 7 安装配置【教程】
May 09 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 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
php cli 方式 在crotab中运行解决
2010/02/08 PHP
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
2016/10/29 PHP
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
js与C#进行时间戳转换
2014/11/14 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
Python collections模块实例讲解
2014/04/07 Python
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
python中常用的数据结构介绍
2021/01/12 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
员工工作表扬信范文
2014/01/13 职场文书
食堂个人先进事迹
2014/01/22 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
员工考核评语大全
2014/04/26 职场文书
班主任与学生安全责任书
2014/07/25 职场文书
艺术节开幕词
2015/01/28 职场文书
科技馆观后感
2015/06/08 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL
nginx之queue的具体使用
2022/06/28 Servers