bbsvs

PHP截取中文字符串的实例

作者:bbsvs 时间:2017-06-14

这篇文章主要是详细介绍PHP截取中文字符串的实例

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


程序说明: 


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


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


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


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


程序代码:  

function FSubstr($title,$start,$len="",$magic=true)  
{ 
/** 
  *  powered by Smartpig 
  *  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) return substr($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 ++; 
    } 
   } 
   else if(substr($title,$i,4) == ">") 
   { 
    $cstep = 4; 
    $length += 4; 
    $i += 3; 
    $realnum ++; 
    if($magic) 
    { 
     $alen ++; 
    } 
   } 
   else if(substr($title,$i,5) == "&") 
   { 
    $cstep = 5; 
    $length += 5; 
    $i += 4; 
    $realnum ++; 
    if($magic) 
    { 
     $alen ++; 
    } 
   } 
   else if(substr($title,$i,6) == """) 
   { 
    $cstep = 6; 
    $length += 6; 
    $i += 5; 
    $realnum ++; 
    if($magic) 
    { 
     $alen ++; 
    } 
   } 
   else if(substr($title,$i,6) == "'") 
   { 
    $cstep = 6; 
    $length += 6; 
    $i += 5; 
    $realnum ++; 
    if($magic) 
    { 
     $alen ++; 
    } 
   } 
   else if(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); 
return substr($title,$start,$length); 
}


TAG: