当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP版自动生成文章摘要

PHP
php项目打包方法
Apache+php+mysql在windows下的安装与配置(图文)
PHP Token(令牌)设计
可以在线执行PHP代码包装修正版
PHP执行速率优化技巧小结
php 无限极分类
Discuz! Passport 通行证整合
几个php应用技巧
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
来自经典的打造简单的PHP&MYSQL留言板
PHP实现Socket服务器的代码
php设计模式介绍之编程惯用法
php mysql数据库操作分页类
php学习 函数 课件
php学习 字符串课件
php学习 数组课件
php学习 面向对象 课件
PHP学习正则表达式 课件
PHP学习文件处理与文件上传 课件
PHP学习mysql课件 高级篇

PHP版自动生成文章摘要


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 212 ::
收藏到网摘: n/a

现内容:截断一段含有HTML代码的文本,但是不会出现围堵标记没有封闭的问题。说明:这是PHP版的,用于在服务器端使用,如果你需要一个客户端版的,请阅读 自动生成文章摘要[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;
};欢迎大家找错误。谢谢。