PHP截取中文字符串的问题_php教程-查字典教程网
PHP截取中文字符串的问题
PHP截取中文字符串的问题
发布时间:2016-12-29 来源:查字典编辑
摘要:以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的问题,解决方法是根据值是否大于等于128来判断是否是双字节字符,以避免出现...

以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的问题,解决方法是根据值是否大于等于128来判断是否是双字节字符,以避免出现乱码的情况。但中英文混合、特殊符号等问题总是存在,现在写一个比较全面的,仅供参考:

程序说明:

1.len参数以中文字符为标准,1len等于2个英文字符,为了形式上好看些

2.如果将magic参数设为false,则中文和英文同等看待,取绝对的字符数

3.特别适用于用htmlspecialchars()进行过编码的字符串

4.能正确处理GB2312中实体字符模式(𖰰)

程序代码:

functionFSubstr($title,$start,$len="",$magic=true)

{

/**

*poweredbySmartpig

*mailto:d.einstein@263.net

*/

$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("/",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);

}

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新php教程学习
    热门php教程学习
    编程开发子分类