php截取中文字串,一般就是根據值是否大於等於128來判斷是否是雙字節字符,以避免出現截取不全與亂碼的情況。
不過,遇到中英文混合、特殊符號也包含其中的情況時,問題就沒那麼容易解決了。
以下是一個全面解決中文字串截取問題的函數,有需要的朋友可以參考下。
說明:
1、len 參數以中文字符為標準,1len等於2個英文字符,為了形式上好看些
2、如果將magic參數設為false,則中文和英文同等看待,取絕對的字符數
3、特別適用於用htmlspecialchars()進行過編碼的字串
4、能正確處理GB2312中實體字元模式(??)
範例:
/**
@移除中文字串 適用於GB2312編碼
@http://www.jbxue.com
unc/ FSubstr($title,$start,$len="",$magic=true)
{
$length = 0;
if($len == "") $len = strlen($title);
///判斷起始為不正確位置
if($start > 0)
{
$cnum = 0;
for($i=0;$i{
if(ord(substr(pstr title,$i,1)) >= 128) $cnum ++;
}
if($cnum%2 != 0) $start--;
unset($cnum);
}
unset($cnum);
}
if( ($title)
$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;
$lengoo ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,4) == ">")
{ $length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$alen ++;
}
}
$alen ++;
}
}
$alen ++;
}
}
) == "&")
{
$cstep = 5;
$length += 5;
$i += 4;
$realnum ++;
if($magic)
}
}
else if(substr($title,$i,6) == """)
{
$cstep = 6;
$leng 6;
$i += 5; ;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,6) == "'")
{ += 6;
$i += 5;
$realnum ++;
if($magic)
{
$alen ++;
}
}
$alen ++;
}
}
else if(preg_match( 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;
}
}
} ord($cur)>=128)
{
$cstep = 2;
$length += 2;
$i += 1;
$realnum ++;
if($i += 1;
$realnum ++;
if($ ;
$ctype = 1;
}
}else{
$cstep = 1;
$length +=1;
$realnum ++;
if($magic)
if($magic)
{
if(($blen*2+$alen) == ($len*2)) break;
if(($blen*2+$alen) == ($len* 2+1))
{
if($ctype == 1)
{
$length -= $cstep;
break;
}else{
break> = $len) break;
}
}
unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($blen);
unset($realnum);
cstep);
return substr($title,$start,$length);
}
?>