找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1590|回复: 10

自动识别汉字的PHP截取字符串函数(utf8、GBK和GB2312有效

  [复制链接]
发表于 2011-8-1 17:12:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
/***************************************************************************


002 函数功能:截取GB2312以及GBK编码的字符串,可以设置截取位置和长度,2个长度代表一个汉字

003 $str------------截取源字符串

004 $start----------起始位置,不能为空,从1算起

005 $len------------截取长度(2代表一个汉字),如果为空则截取到字符串末尾

006 主意:该函数不能用于utf8编码字符串,会出现乱码

007 ***************************************************************************/

008 function substr_for_gb2312($str,$start,$len=null)

009 {

010     $totlelength = strlen($str);

011        

012     //特例情况

013     if ($len == null) $len = $totlelength;

014     if ($len ==0) return "";

015     if ($len >= $totlelength && $start == 0 ) return $str;

016     if ($start > $totlelength) return "";

017        

018     //分析$start

019     if ($start < 0 ) //$start<0时,转化为$start>0时的定位.

020     {

021         if ( abs($start) >= $totlelength )

022             $start = 0;

023         else

024             $start = $totlelength - abs($start);

025     }

026   

027     //确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.

028     if ($start > 0)

029     {

030         $i = $start-1;

031         $flag = -1;

032         while ($i >= 0)

033         {

034             if ( ord(substr($str,$i,1)) > 160)

035             {

036                 $flag = -1*$flag;

037             }

038            else break;

039             $i--;

040         }

041         if($flag==1)

042         {

043             $start = $start - 1;

044             $len++; //保证不位移.

045         }

046     }

047   

048     $str = substr($str,$start);//截除字符串$str的$start位前的字符

049     $totlelength = strlen($str);

050        

051     //确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.

052     if ($len<0) $len = $totlelength - abs($len);

053     if ($len <= 0) return "";

054     $i=min($len,$totlelength);

055     $i--;

056     $flag = -1;

057     while ($i >= 0)

058     {

059         if (ord(substr($str,$i,1))>160)

060         {

061             $flag=-1*$flag;

062         }

063         else break;

064         $i--;

065     }

066        

067     if($flag == 1)  $len=$len-1;

068     $subit=substr($str,0,$len);

069        

070     return $subit;

071 }

072   

073 /***************************************************************************

074 函数功能:截取GB2312以及GBK编码的字符串,从第一个字符开始截取,2个长度代表一个汉字

075 $str------------截取源字符串

076 $len------------截取长度(2代表一个汉字)

077 主意:该函数不能用于utf8编码字符串,会出现乱码

078 ***************************************************************************/

079 function splitStr($str,$len)

080 {

081     if($len<=0)

082     {

083         return false;

084     }

085     else

086     {

087         $sLen=strlen($str);

088         if($len>=$sLen)   

089             return $str;

090         else

091         {

092             for($i=0;$i<($len-1);$i++)

093             {

094                 if(ord(substr($str,$i,1))>0xa0)

095                     $i++;

096             }

097               

098             if($i>=$len)

099                 return substr($str,0,$len);

100             elseif(ord(substr($str,$i,1))>0xa0)

101                 return substr($str,0,$len-1);

102             else

103                 return substr($str,0,$len);

104         }

105     }

106 }

107   

108   

109 /***************************************************************************

110 函数功能:截取utf8或GB2312或者GBK编码的字符串,从第一个字符开始截取,1个长度代表一个汉字

111 $sourcestr------------截取源字符串

112 $cutlength------------截取长度(字数)

113 这个函数很万能,但是相对前两个耗资源一些

114 ***************************************************************************/

115 function substr_for_utf8($sourcestr,$cutlength)

116 {

117     $returnstr='';

118     $i=0;

119     $n=0;

120     $str_length=strlen($sourcestr); //字符串的字节数

121     while (($n<$cutlength) and ($i<=$str_length))

122     {

123         $temp_str=substr($sourcestr,$i,1);

124         $ascnum=Ord($temp_str); //得到字符串中第$i位字符的ascii码

125         if ($ascnum>=224) //如果ASCII位高与224,

126         {

127             $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符         

128             $i=$i+3; //实际Byte计为3

129             $n++; //字串长度计1

130         }

131         elseif ($ascnum>=192)//如果ASCII位高与192,

132         {

133             $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符

134             $i=$i+2; //实际Byte计为2

135             $n++; //字串长度计1

136         }

137         elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,

138         {

139             $returnstr=$returnstr.substr($sourcestr,$i,1);

140             $i=$i+1; //实际的Byte数仍计1个

141             $n++; //但考虑整体美观,大写字母计成一个高位字符

142         }

143         else //其他情况下,包括小写字母和半角标点符号,

144         {

145             $returnstr=$returnstr.substr($sourcestr,$i,1);

146             $i=$i+1;    //实际的Byte数计1个

147             $n=$n+0.5;  //小写字母和半角标点等与半个高位字符宽...

148         }

149     }

150        

151     if ($str_length>$cutlength)

152     {

153         $returnstr = $returnstr . "...";    //超过长度时在尾处加上省略号

154     }

155        

156     return $returnstr;

157 }

158   

159   

160 ?>
http://www.shuihan.com/article/146



发表于 2011-8-23 01:42:52 | 显示全部楼层
支持~~顶顶~~~



















正味网为您推荐[探索]--工程大突破第五季
 楼主| 发表于 2011-8-23 15:24:47 | 显示全部楼层
噘囜饴缗 发表于 2011-8-23 01:42
支持~~顶顶~~~

发表于 2011-9-2 13:34:03 | 显示全部楼层
爱情其实是一种习惯回你习惯生活中有他◎他习惯生活中有你。拥有的时候不觉得什么◢一旦失去□却仿佛失去了所有。
                                               
                       
                       
                       
                       
                       
                       
                       
                       












影视界为您推荐[其它]--DERO密室游戏大脱逃
发表于 2011-9-24 11:01:18 | 显示全部楼层
大家顶啊,这么好的帖子,楼主辛苦了












アルバイト     ビジネス英語    TOEIC    アダルト
发表于 2011-9-30 15:45:50 | 显示全部楼层
发表于 2011-10-8 14:35:48 | 显示全部楼层
谢谢分享哈













发表于 2012-1-4 16:33:48 | 显示全部楼层
  牛皮癣是一种顽固的皮肤病,最简洁明了的影响就是危害心理健康,给患者带来沉重的思想压力。对生理的影响也是不能小窥的,久病则可直接影响患者的肝、肺、肾等脏器及其功能,并遗传后代。它不仅给患者肉体上带来痛苦,更使正常人对患者产生厌恶及躲避心理。给患者的生活、社会交际中带来很大障碍,从而在精神上造成沉重的思想负担,给患者增加了不可言喻的痛苦。   
  牛皮癣秋冬季高发且患者手脚冰冷,不知道是什么原因造成的?很多患者和家庭对牛皮癣的发病原因始终不明确,从而导致牛皮癣反复发作,那么究竟是什么牛皮癣医院原因诱发牛皮癣?
发表于 2012-2-5 15:51:32 | 显示全部楼层
黑斗篷老者深深吸了一口气:“最后一个问题,R国某军界首脑在家悬梁自尽,警方分析这件凶案绝非**。说来说去,此事大概也与阁下不无关系吧?”
        武星河哈哈一笑:“你是说那个比猪还肥的军界巨头吗?不错,那人是我杀的。那厮人面猪相,一张破嘴把不住门,成天胡说八道。我看他不顺眼不是一天两天了。这次居然号称要以武力强占我华夏领土通吃岛,岂不该死?”
        忽然,武星河紧盯着老者胸口那一朵带血蔷薇,哑然失笑起来:“我说,什么时候,食血蔷薇组织开始干起世界JC的勾当了?莫非以你们的臭名昭著,还想玩一把正义不成?”
        老者眯着眼睛,阴森森笑道:“正义这种东西,在我们地下世界里,一文不名。不怕告诉你,有人出了五十亿美金要你的命。在我们眼里,你干过什么并不重要;重要的是,取到你的人头,可以得到一张五十亿美金的支票。”
        “五十亿美金?”武星河倒没想到,他如今的身价,竟然能涨到这么变态的地步,不过转念一想,念头也便通达了。
        他此前干下的这一桩桩案子,每一件事都可以上升到政治高度,那么这件案子的背后,出现国家意志也就不希奇了。河南白癜风治疗最好医院
        既然出现国家意志,那么再高的酬金也便不难理解了。
        事实也是如此,如此天价高额的酬金,其背后的委托方,其实已经超出了个人甚至是财团的承受范围!
发表于 2012-3-7 09:55:17 | 显示全部楼层
这些货中有小亚细亚的羊毛、细麻、羊皮纸、蜂蜜、地毯和油类,本地生产的玻璃、无花果、胡桃、香精、帕尔迈拉岛的衣料和药材,阿拉伯的生姜、肉桂和宝石,埃及的玉米、纸张、花岗岩、雪花石膏和黑色瓷器,巴比伦的挂毯,罗马的油画,以及希腊的雕像。空气中弥漫着香精的气味,海菲敏感的鼻子还闻到了香甜的李子、苹果、乳酪和生姜的味道。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部快速回复上一主题下一主题返回列表找客服手机访问
快速回复 返回顶部 返回列表