PHP截取中文字符串方法
PHP截取中文字符串方法
程序一:PHP截取中文字符串方法
由于网站首页以及vTigerCRM里经常在截取中文字符串时出现乱码(使用substr),今天找到一个比较好的截取中文字符串方法,在此与大家共享。
functionmsubstr($str,$start,$len){
$tmpstr="";
$strlen=$start+$len;
for($i=0;$i<$strlen;$i++){
if(ord(substr($str,$i,1))>0xa0){
$tmpstr.=substr($str,$i,2);
$i++;
}else
$tmpstr.=substr($str,$i,1);
}
return$tmpstr;
}
程序二:PHP截取UTF-8字符串,解决半字符问题
* PHP截取UTF-8字符串,解决半字符问题。
* 英文、数字(半角)为1字节(8位),中文(全角)为3字节
* @return 取出的字符串, 当$len小于等于0时, 会返回整个字符串
* @param $str 源字符串
* $len 左边的子串的长度
functionutf_substr($str,$len)
{
for($i=0;$i<$len;$i++)
{
$temp_str=substr($str,0,1);
if(ord($temp_str)>127)
{
$i++;
if($i<$len)
{
$new_str[]=substr($str,0,3);
$str=substr($str,3);
}
}
else
{
$new_str[]=substr($str,0,1);
$str=substr($str,1);
}
}
returnjoin($new_str);
}
?>
phputf-8字符串截取
functioncutstr($string,$length){
preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/",$string,$info);
for($i=0;$i
$wordscut.=$info[0][$i];
$j=ord($info[0][$i])>127?$j+2:$j+1;
if($j>$length-3){
return$wordscut."...";
}
}
returnjoin('',$info[0]);
}
$string="242432反对感是456犯得上广泛大使馆地方7890";
for($i=0;$i
{
echocutstr($string,$i)."
";
}
?>
截取utf-8字符串函数
为了支持多语言,数据库里的字符串可能保存为UTF-8编码,在网站开发中可能需要用php截取字符串的一部分。为了避免出现乱码现象,编写如下的UTF-8字符串截取函数
关于utf-8的原理请看 UTF-8 FAQ
UTF-8编码的字符可能由1~3个字节组成, 具体数目可以由第一个字节判断出来。(理论上可能更长,但这里假设不超过3个字节)
第一个字节大于224的,它与它之后的2个字节一起组成一个UTF-8字符
第一个字节大于192小于224的,它与它之后的1个字节组成一个UTF-8字符
否则第一个字节本身就是一个英文字符(包括数字和一小部分标点符号)。
以前为某网站设计的代码(也是现在用在首页的长度截取的函数)
Code:
<?php//Cut_Str;
//$sourcestr是要处理的字符串
//$cutlength为截取的长度(即字数)
functioncut_str($sourcestr,$cutlength)
{
$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr);//字符串的字节数
while(($n<$cutlength)and($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
if($ascnum>=224)//如果ASCII位高与224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3);//根据UTF-8编码规范,将3个连续的字符计为单个字符
$i=$i+3;//实际Byte计为3
$n++;//字串长度计1
}
elseif($ascnum>=192)//如果ASCII位高与192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2);//根据UTF-8编码规范,将2个连续的字符计为单个字符
$i=$i+2;//实际Byte计为2
$n++;//字串长度计1
}
elseif($ascnum>=65&&$ascnum<=90)//如果是大写字母,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1;//实际的Byte数仍计1个
$n++;//但考虑整体美观,大写字母计成一个高位字符
}
else//其他情况下,包括小写字母和半角标点符号,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1;//实际的Byte数计1个
$n=$n+0.5;//小写字母和半角标点等与半个高位字符宽...
}
}
if($str_length>$cutlength){
$returnstr=$returnstr."...";//超过长度时在尾处加上省略号
}
return$returnstr;
}
截取utf-8字符串函数
functionFSubstr($title,$start,$len="",$magic=true)
{
/**
*poweredbySmartpig
*mailto:d.einstein@263.net
*/
if($len=="")$len=strlen($title);
if($start!=0)
{
$startv=ord(substr($title,$start,1));
if($startv>=128)
{
if($startv<192)
{
for($i=$start-1;$i>0;$i--)
{
$tempv=ord(substr($title,$i,1));
if($tempv>=192)break;
}
$start=$i;
}
}
}
if(strlen($title)<=$len)returnsubstr($title,$start,$len);
$alen=0;
$blen=0;
$realnum=0;
for($i=$start;$i
{
$ctype=0;
$cstep=0;
$cur=substr($title,$i,1);
if($cur=="&")
{
if(substr($title,$i,4)=="<")
{
$cstep=4;
$length+=4;
$i+=3;
$realnum++;
if($magic)
{
$alen++;
}
}
elseif(substr($title,$i,4)==">")
{
$cstep=4;
$length+=4;
$i+=3;
$realnum++;
if($magic)
{
$alen++;
}
}
elseif(substr($title,$i,5)=="&")
{
$cstep=5;
$length+=5;
$i+=4;
$realnum++;
if($magic)
{
$alen++;
}
}
elseif(substr($title,$i,6)==""")
{
$cstep=6;
$length+=6;
$i+=5;
$realnum++;
if($magic)
{
$alen++;
}
}
elseif(preg_match("/&#(\d+);?/i",substr($title,$i,8),$match))
{
$cstep=strlen($match[0]);
$length+=strlen($match[0]);
$i+=strlen($match[0])-1;
$realnum++;
if($magic)
{
$blen++;
$ctype=1;
}
}
}else{
if(ord($cur)>=252)
{
$cstep=6;
$length+=6;
$i+=5;
$realnum++;
if($magic)
{
$blen++;
$ctype=1;
}
}elseif(ord($cur)>=248){
$cstep=5;
$length+=5;
$i+=4;
$realnum++;
if($magic)
{
$ctype=1;
$blen++;
}
}elseif(ord($cur)>=240){
$cstep=4;
$length+=4;
$i+=3;
$realnum++;
if($magic)
{
$blen++;
$ctype=1;
}
}elseif(ord($cur)>=224){
$cstep=3;
$length+=3;
$i+=2;
$realnum++;
if($magic)
{
$ctype=1;
$blen++;
}
}elseif(ord($cur)>=192){
$cstep=2;
$length+=2;
$i+=1;
$realnum++;
if($magic)
{
$blen++;
$ctype=1;
}
}elseif(ord($cur)>=128){
$length+=1;
}else{
$cstep=1;
$length+=1;
$realnum++;
if($magic)
{
if(ord($cur)>=65&&ord($cur)<=90)
{
$blen++;
}else{
$alen++;
}
}
}
}
if($magic)
{
if(($blen*2+$alen)==($len*2))break;
if(($blen*2+$alen)==($len*2+1))
{
if($ctype==1)
{
$length-=$cstep;
break;
}else{
break;
}
}
}else{
if($realnum==$len)break;
}
}
unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep);
returnsubstr($title,$start,$length);
}
相关文章
关键词: 技巧
责任编辑:谢妍妍