自动识别汉字的PHP截取字符串函数(utf8、GBK和GB2312有效
/***************************************************************************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
支持~~顶顶~~~
static/image/common/sigline.gif
正味网为您推荐[探索]--工程大突破第五季 噘囜饴缗 发表于 2011-8-23 01:42 static/image/common/back.gif
支持~~顶顶~~~
{:3_43:} 爱情其实是一种习惯回你习惯生活中有他◎他习惯生活中有你。拥有的时候不觉得什么◢一旦失去□却仿佛失去了所有。
static/image/common/sigline.gif
影视界为您推荐[其它]--DERO密室游戏大脱逃 大家顶啊,这么好的帖子,楼主辛苦了
static/image/common/sigline.gif
アルバイト ビジネス英語 TOEIC アダルト 顶一个先吧
static/image/common/sigline.gif
注册并发布信息日*赚N元 注册地址:http://www.baixing.com/?u=58493516 谢谢分享哈
static/image/common/sigline.gif
http://img2081.poco.cn/mypoco/myphoto/20110822/16/64165363201108221627279573116820626_003.jpg 牛皮癣是一种顽固的皮肤病,最简洁明了的影响就是危害心理健康,给患者带来沉重的思想压力。对生理的影响也是不能小窥的,久病则可直接影响患者的肝、肺、肾等脏器及其功能,并遗传后代。它不仅给患者肉体上带来痛苦,更使正常人对患者产生厌恶及躲避心理。给患者的生活、社会交际中带来很大障碍,从而在精神上造成沉重的思想负担,给患者增加了不可言喻的痛苦。
牛皮癣秋冬季高发且患者手脚冰冷,不知道是什么原因造成的?很多患者和家庭对牛皮癣的发病原因始终不明确,从而导致牛皮癣反复发作,那么究竟是什么牛皮癣医院原因诱发牛皮癣? 黑斗篷老者深深吸了一口气:“最后一个问题,R国某军界首脑在家悬梁自尽,警方分析这件凶案绝非**。说来说去,此事大概也与阁下不无关系吧?”
武星河哈哈一笑:“你是说那个比猪还肥的军界巨头吗?不错,那人是我杀的。那厮人面猪相,一张破嘴把不住门,成天胡说八道。我看他不顺眼不是一天两天了。这次居然号称要以武力强占我华夏领土通吃岛,岂不该死?”
忽然,武星河紧盯着老者胸口那一朵带血蔷薇,哑然失笑起来:“我说,什么时候,食血蔷薇组织开始干起世界JC的勾当了?莫非以你们的臭名昭著,还想玩一把正义不成?”
老者眯着眼睛,阴森森笑道:“正义这种东西,在我们地下世界里,一文不名。不怕告诉你,有人出了五十亿美金要你的命。在我们眼里,你干过什么并不重要;重要的是,取到你的人头,可以得到一张五十亿美金的支票。”
“五十亿美金?”武星河倒没想到,他如今的身价,竟然能涨到这么变态的地步,不过转念一想,念头也便通达了。
他此前干下的这一桩桩案子,每一件事都可以上升到政治高度,那么这件案子的背后,出现国家意志也就不希奇了。河南白癜风治疗最好医院
既然出现国家意志,那么再高的酬金也便不难理解了。
事实也是如此,如此天价高额的酬金,其背后的委托方,其实已经超出了个人甚至是财团的承受范围! 这些货中有小亚细亚的羊毛、细麻、羊皮纸、蜂蜜、地毯和油类,本地生产的玻璃、无花果、胡桃、香精、帕尔迈拉岛的衣料和药材,阿拉伯的生姜、肉桂和宝石,埃及的玉米、纸张、花岗岩、雪花石膏和黑色瓷器,巴比伦的挂毯,罗马的油画,以及希腊的雕像。空气中弥漫着香精的气味,海菲敏感的鼻子还闻到了香甜的李子、苹果、乳酪和生姜的味道。
页:
[1]
2