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调用三种数据库的方法(1)
Oct 09 PHP
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
Dec 25 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
PHP静态文件生成类实例
Nov 29 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
php 使用fopen函数创建、打开文件详解及实例代码
Sep 24 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
Nov 15 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
PHP反射原理与用法深入分析
Sep 28 PHP
Laravel基础-关于引入公共文件的两种方式
Oct 18 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编程效率的方法
2013/11/07 PHP
Thinkphp调用Image类生成缩略图的方法
2015/03/07 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
AngularJS的内置过滤器详解
2015/05/14 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
老生常谈JavaScript中的this关键字
2016/10/01 Javascript
vue.js的安装方法
2017/05/12 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
浅谈React高阶组件
2018/03/28 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
容易被忽略的Python内置类型
2020/09/03 Python
python raise的基本使用
2020/09/10 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
初中生学习的自我评价
2013/11/14 职场文书
办公室驾驶员岗位职责
2013/11/15 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
行政处罚告知书
2015/07/01 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis