|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/***************************************************************************
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
|
|