php汉字截取

PHPABC PHP开发 1,479 次浏览 , 没有评论

在PHP开发中经常会遇到载取固定数目汉字的情况,但是PHP默认的substr函数只支持英文截取,虽然mbstring扩展提供的方法可以实现 宽字符的截取功能,但是有一些服务器是没有开启这个模块,所以选择了PHP实现汉字截取,这样通用性比较高,再则,一般实现这样的功能需要的字数都比较 少,所以性能方面并没有太大损失,如果需要大量字符截取的话建议还是使用mb_substr这类的函数,以提高性能

1. 截取GB2312中文字符串

     <?php    
    //截取中文字符串   
    function mysubstr($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;   
   }   
   ?>

2. 截取utf8编码的多字节字符串

   <?php   
   //截取utf8字符串   
   function utf8Substr($str, $from, $len)   
   {   
      return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.   
                         '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',   
                         '$1',$str);   
   }   
   ?>

3. UTF-8、GB2312都支持的汉字截取函数

    <?php   
    /*   
    Utf-8、gb2312都支持的汉字截取函数   
    cut_str(字符串, 截取长度, 开始长度, 编码);   
    编码默认为 utf-8   
    开始长度默认为 0   
    */    
 
    function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')    
   {    
      if($code == 'UTF-8')    
      {    
          $pa = "/[\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]/";    
          preg_match_all($pa, $string, $t_string);    
 
          if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."...";    
          return join('', array_slice($t_string[0], $start, $sublen));    
      }    
      else    
      {    
          $start = $start*2;    
          $sublen = $sublen*2;    
          $strlen = strlen($string);    
          $tmpstr = '';    
 
         for($i=0; $i<$strlen; $i++)    
          {    
              if($i>=$start && $i<($start+$sublen))    
              {    
                  if(ord(substr($string, $i, 1))>129)    
                  {    
                      $tmpstr.= substr($string, $i, 2);    
                  }    
                  else    
                  {    
                      $tmpstr.= substr($string, $i, 1);    
                  }    
              }    
              if(ord(substr($string, $i, 1))>129) $i++;    
          }    
          if(strlen($tmpstr)<$strlen ) $tmpstr.= "...";    
          return $tmpstr;    
      }    
   }    
 
   $str = "abcd需要截取的字符串";    
   echo cut_str($str, 8, 0, 'gb2312');    
   ?>

使用上边三类方法基本可以满足平常截取要求,在没有mbstring扩展时使用起来相当方便

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Go