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 什么是PEAR?(第三篇)
Mar 19 PHP
关于session在PHP5的配置文件中的详细设置参数说明
Apr 20 PHP
php警告Creating default object from empty value 问题的解决方法
Apr 02 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
php 读取输出其他文件的实现方法
Jul 26 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
Dec 19 PHP
php cli模式下获取参数的方法
May 05 PHP
详解php与ethereum客户端交互
Apr 28 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
PDO::_construct讲解
Jan 27 PHP
php抽象类和接口知识点整理总结
Aug 02 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
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
在Python中移动目录结构的方法
2016/01/31 Python
python daemon守护进程实现
2016/08/27 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
用uWSGI和Nginx部署Flask项目的方法示例
2019/05/05 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
Python列表推导式实现代码实例
2020/09/09 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
优秀求职信范文分享
2014/01/26 职场文书
导游词之昭君岛
2020/01/17 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
Python使用Web框架Flask开发项目
2022/06/01 Python