喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 帮助

RSS 订阅当前论坛  

喜悦证交所已经关闭

上一主题 下一主题
 12  1/2  1  2  > 
     
标题: [问题] 从discuz拷贝了一个截取字符的函数,请高手帮忙解释一下。谢谢!!  
 
smilesoul (smilesoul)
注册会员
Rank: 2
初级会员



UID 31553
精华 0
积分 113
帖子 76
金钱 113 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2004-9-29
来自 湖北荆州
状态 离线
[广告]: q m
从discuz拷贝了一个截取字符的函数,请高手帮忙解释一下。谢谢!!

function cutstr($string, $length, $dot = ' ...') {
        global $charset;

        if(strlen($string) <= $length) {
                return $string;
        }

        $string = str_replace(array('&', '"', '&lt;', '&gt;'), array('&', '"', '<', '>'), $string);

        $strcut = '';
        if(strtolower($charset) == 'utf-8') {

                $n = $tn = $noc = 0;
                while($n < strlen($string)) {

                        $t = ord($string[$n]);
                        if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
                                $tn = 1; $n++; $noc++;
                        } elseif(194 <= $t && $t <= 223) {
                                $tn = 2; $n += 2; $noc += 2;
                        } elseif(224 <= $t && $t < 239) {
                                $tn = 3; $n += 3; $noc += 2;
                        } elseif(240 <= $t && $t <= 247) {
                                $tn = 4; $n += 4; $noc += 2;
                        } elseif(248 <= $t && $t <= 251) {
                                $tn = 5; $n += 5; $noc += 2;
                        } elseif($t == 252 || $t == 253) {
                                $tn = 6; $n += 6; $noc += 2;
                        } else {
                                $n++;
                        }

                        if($noc >= $length) {
                                break;
                        }

                }
                if($noc > $length) {
                        $n -= $tn;
                }

                $strcut = substr($string, 0, $n);

        } else {
                for($i = 0; $i < $length; $i++) {
                        $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
                }
        }

从discuz拷贝了一个截取字符的函数,请高手帮忙解释一下。谢谢!!

关于utf-8那部分有点不懂   谢谢
2008-3-25 03:58 PM#1
查看资料  发短消息  QQ  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 11758
帖子 4930
金钱 11755 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 华奥永通(北京)有限公司高薪诚聘:高级PHP工程师,WEB前台开发工程师(XHTML/CSS/Ajax)
你这个函数没有复制全吧



最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2008-3-25 04:26 PM#2
查看资料  Blog  发短消息  顶部
 
海里一粒沙 (海里一粒沙)
注册会员
Rank: 2
初级会员



UID 65364
精华 0
积分 83
帖子 74
金钱 83 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2005-8-1
状态 离线
[推荐阅读] 双线机房托管::上海移动机房托管::上海电信机房托管
就是几个函数 查手册啊
按着IF ELSE走
主要是判断的 ASCII码
2008-3-25 05:33 PM#3
查看资料  发短消息  顶部
 
smilesoul (smilesoul)
注册会员
Rank: 2
初级会员



UID 31553
精华 0
积分 113
帖子 76
金钱 113 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2004-9-29
来自 湖北荆州
状态 离线
[推荐阅读] 成都招聘
回复 #2 sanders_yao 的帖子

是的  应该是   请帮忙解释一下  谢谢 !!!

function cutstr($string, $length, $dot = ' ...') {
        global $charset;
        if(strlen($string) <= $length) {
                return $string;
        }
        $string = str_replace(array('&', '"', '&lt;', '&gt;'), array('&', '"', '<', '>'), $string);
        $strcut = '';
        if(strtolower($charset) == 'utf-8') {
                $n = $tn = $noc = 0;
                while($n < strlen($string)) {
                        $t = ord($string[$n]);
                        if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
                                $tn = 1; $n++; $noc++;
                        } elseif(194 <= $t && $t <= 223) {
                                $tn = 2; $n += 2; $noc += 2;
                        } elseif(224 <= $t && $t < 239) {
                                $tn = 3; $n += 3; $noc += 2;
                        } elseif(240 <= $t && $t <= 247) {
                                $tn = 4; $n += 4; $noc += 2;
                        } elseif(248 <= $t && $t <= 251) {
                                $tn = 5; $n += 5; $noc += 2;
                        } elseif($t == 252 || $t == 253) {
                                $tn = 6; $n += 6; $noc += 2;
                        } else {
                                $n++;
                        }
                        if($noc >= $length) {
                                break;
                        }
                }
                if($noc > $length) {
                        $n -= $tn;
                }
                $strcut = substr($string, 0, $n);
        } else {
                for($i = 0; $i < $length-strlen($dot)-1; $i++) {
                        $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
        }
        $strcut = str_replace(array('&', '"', '<', '>'), array('&', '"', '&lt;', '&gt;'), $strcut);
    return $strcut.$dot;
}
}
2008-3-25 05:53 PM#4
查看资料  发短消息  QQ  顶部
 
柳甲
中级会员
Rank: 3Rank: 3
中级会员



UID 23541
精华 1
积分 302
帖子 274
金钱 292 喜悦币
威望 10
人脉 0
阅读权限 30
注册 2003-9-28
状态 离线
[推荐阅读] 自动request提交文档 问题~~急~大家帮帮忙


<?php
/**
$string 要截取的字符串
$length 保留多少个字节
$dot 结尾字符
*/

function cutstr($string$length$dot ' ...') {
        global 
$charset// 网页编码

        // 如果字符串小于要给出的保留数就直接输出
        
if(strlen($string) <= $length) {
                return 
$string;
        }

        
// 把原程序中htmlspecialchars转换了的字符还原
        
$string str_replace(array('&amp;amp;''&amp;quot;''&lt;''&gt;'), array('&''"''<''>'), $string);
        
        
// 初始输出变量
        
$strcut '';

        
// 如果是utf-8编码(这个判断有点不全,有可能是utf8)
        
if(strtolower($charset) == 'utf-8') {
                
$n $tn $noc 0// 初始循环指针$n,最后一个字位数$tn,目前取到的字节数($noc都+2没看明白是什么意思)
                
while($n strlen($string)) {
                        
$t ord($string[$n]);
                        if(
$t == || $t == 10 || (32 <= $t && $t <= 126)) {
                                
$tn 1$n++; $noc++; // 如果是英文半角符号等,$n指针后移1位,$tn最后字是1位
                        
} elseif(194 <= $t && $t <= 223) {
                                
$tn 2$n += 2$noc += 2// 如果是二字节字符$n指针后移2位,$tn最后字是2位
                        
} elseif(224 <= $t && $t 239) {
                                
$tn 3$n += 3$noc += 2//如果是三字节(可以理解为中文字),$n后移3位,$tn最后字是3位
                        
} elseif(240 <= $t && $t <= 247) {
                                
$tn 4$n += 4$noc += 2// 跟上面意思一样的
                        
} elseif(248 <= $t && $t <= 251) {
                                
$tn 5$n += 5$noc += 2;
                        } elseif(
$t == 252 || $t == 253) {
                                
$tn 6$n += 6$noc += 2;
                        } else {
                                
$n++;
                        }

                        
// 超过了要取的数就跳出循环 
                        
if($noc >= $length) {
                                break;
                        }
                }

                
// 这个地方是把最后一个字去掉,以备加$dot
                
if($noc $length) {
                        
$n -= $tn;
                }
                
$strcut substr($string0$n);
        } else {
            
// 不是utf-8编码的全角就后移2位
                
for($i 0$i $length-strlen($dot)-1$i++) {
                        
$strcut .= ord($string[$i]) > 127 $string[$i].$string[++$i] : $string[$i];
        }

        
// 再将特殊html转换(不明白有htmlspecialchars函数为什么不用)
        
$strcut str_replace(array('&''"''<''>'), array('&''"''&lt;''&gt;'), $strcut);
    return 
$strcut.$dot// 最后把截取加上$dot输出
}

i
?>
[ 本帖最后由 柳甲 于 2008-4-4 01:33 AM 编辑 ]




未名工作室http://www.qqwm.com
网站后台开发,PERL,PHP,JSP
2008-4-4 01:29 AM#5
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
szgekko
新手上路
Rank: 1



UID 94405
精华 0
积分 10
帖子 8
金钱 10 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-6-23
状态 离线
[推荐阅读] 李建衡《月亮怎能代表我的心》居高榜首
楼上猛!
谢谢分享 我收藏了!
2008-4-4 11:33 AM#6
查看资料  发短消息  顶部
 
uuq
高级会员
Rank: 4
中级会员


UID 28149
精华 1
积分 821
帖子 859
金钱 811 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2004-4-27
来自 广州
状态 离线
[推荐阅读] 谁有支持表格的编辑器
还用这些函数干什么 所以通用程序就是麻烦

直接用php内置函数mb_substr

mb_substr支持双字节 现在都是php5时代了 所以不是抱着这些老东西不放
2008-4-4 04:17 PM#7
查看资料  发短消息  顶部
 
柳甲
中级会员
Rank: 3Rank: 3
中级会员



UID 23541
精华 1
积分 302
帖子 274
金钱 292 喜悦币
威望 10
人脉 0
阅读权限 30
注册 2003-9-28
状态 离线
[推荐阅读] 广东电信100M独享,浙江电信百M独享带宽QQ445676667
楼上有理,不过这个函数确定不怎么的,就算要通用,也应该通用mb_substr,还用字节来取就真的过时了
多说一句,没用过discuz,看过几行他们的代码,是因为看过他们的代码才不想用这个论坛的

初学者要读论坛代码,建议读vbb和phpbb,才能真正让你有所收获




未名工作室http://www.qqwm.com
网站后台开发,PERL,PHP,JSP
2008-4-4 06:54 PM#8
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
cdut2008
新手上路
Rank: 1



UID 117527
精华 0
积分 4
帖子 4
金钱 4 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2008-4-3
状态 离线
[推荐阅读] Just template---发一个自己编写的模板
学习.......................................................................
2008-4-5 09:20 AM#9
查看资料  发短消息  顶部
 
manhere
新手上路
Rank: 1



UID 84567
精华 0
积分 6
帖子 6
金钱 6 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2006-12-10
状态 离线
[推荐阅读] 艰难时刻!
高人辈出 汗颜~
2008-4-5 02:33 PM#10
查看资料  发短消息  顶部
 12  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.035631 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP