jiang1799 发表于 2015-8-27 12:03:25

解决PHP截取中文字符串问题

  PHP截取字符串如果是英文那很好办,直接用substr就行了,一般不会出现乱码.中文就有点麻烦了.
下面给出两种解决办法:
(一)直接使用Multi-Byte函数库的mb_substr();函数就行了,实例代码如下

<?php
echo mb_substr($str, $start, $length, $encoding);
echo "<br />";
?>   这种方法简单,快速,安全,漂亮,诱惑...反正什么好词都可以形容它,但是,可惜我的GoDaddy主机不支持,所以得另寻出路
(二)自定义截取中文字符串函数,基本上就是仿照mb_substr写个函数,直接调用罢了,以下为我找到的代码,其实很简单

<?php
functionsubstr_cn($string_input,$start,$length)
{
   /* 功能:
      * 此算法用于截取中文字符串
      * 函数以单个完整字符为单位进行截取,即一个英文字符和一个中文字符均表示一个单位长度
      * 参数:
      * 参数$string为要截取的字符串,
      * 参数$start为欲截取的起始位置,
      * 参数$length为要截取的字符个数(一个汉字或英文字符都算一个)
      * 返回值:
      * 返回截取结果字符串
      * */
   $str_input=$string_input;
   $len=$length;
   $return_str="";
   //定义空字符串
   for ($i=0;$i<2*$len+2;$i++)
         $return_str=$return_str." ";
   $start_index=0;
   //计算起始字节偏移量
   for ($i=0;$i<$start;$i++)
   {
         if (ord($str_input{$start_index}>=161))          //是汉语      
         {
             $start_index+=2;
         }
         else                                          //是英文
         {
             $start_index+=1;
         }         
   }   
   $chr_index=$start_index;
   //截取
   for ($i=0;$i<$len;$i++)
   {
         $asc=ord($str_input{$chr_index});
         if ($asc>=161)
         {
             $return_str{$i}=chr($asc);
             $return_str{$i+1}=chr(ord($str_input{$chr_index+1}));
             $len+=1; //结束条件加1
             $i++;    //位置偏移量加1
             $chr_index+=2;
             continue;            
         }
         else
         {
             $return_str{$i}=chr($asc);
             $chr_index+=1;
         }
   }   
   return trim($return_str);
}//end of substr_cn
?>
页: [1]
查看完整版本: 解决PHP截取中文字符串问题