PHP截取中文字符串的问题
2018-09-07 14:15
以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的问题,解决方法是根据值是否大于等于128来判断是否是双字节字符,以避免出现乱码的情况。但中英文混合、特殊符号等问题总是存在,现在写一个比较全面的,仅供参考:
程序说明:
1.len参数以中文字符为标准,1len等于2个英文字符,为了形式上好看些
2.如果将magic参数设为false,则中文和英文同等看待,取绝对的字符数
3.特别适用于用htmlspecialchars()进行过编码的字符串
4.能正确处理GB2312中实体字符模式(?)
程序代码:
functionFSubstr($title,$start,$len=,$magic=true)
{
/**
*poweredbySmartpig
*/
$length=0;
if($len==)$len=strlen($title);
//判断起始为不正确位置
if($start>0)
{
$cnum=0;
for($i=0;$i<$start;$i++)
{
if(ord(substr($title,$i,1))>=128)$cnum++;
}
if($cnum%2!=0)$start--;
unset($cnum);
}
if(strlen($title)<=$len)returnsubstr($title,$start,$len);
$alen=0;
$blen=0;
$realnum=0;
for($i=$start;$i<strlen($title);$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(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)>=128)
{
$cstep=2;
$length+=2;
$i+=1;
$realnum++;
if($magic)
{
$blen++;
$ctype=1;
}
}else{
$cstep=1;
$length+=1;
$realnum++;
if($magic)
{
$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);
}