PHP截取字符串,中英文字符及标点符号混合的字符串截取函数(绝对不出现乱码)

发布时间:2009年06月29日      浏览次数:1457 次
刚学PHP时,找了很多关于PHP截取字符串的文章,看来看去都是一个样,不管说如何如何好的函数,使用起来都或多或少还是会出现乱码的现象,最后觉得还是自已动手来写一个函数吧,花了点时间好好研究了一下相关原理,结果写出了这个函数,经多次反复测试通过。
绝对的原创,为了让更多学PHP的人能够更好的学习与使用,欢迎转载本文章。
声明:在转载时,请注明作者的相关信息与出处。(相关作者信息如下)
-----------------------------
作者:Leo Tang
QQ:475003427
Email: admin_8@126.com
来自:桂林唯创网络 www.93cn.net
-----------------------------
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?
////////////////////////////////////////////////////////////////////
// PHP截取中英文及标点符号混合的字符串函数(绝对不会出现乱码)
// 本程序在utf-8、gb2312中测试通过。使用者自行测试big5。
// 函数 left( 源字符串, 截取指定的字符串个数, 编码(可省略,默认为utf-8) )
////////////////////////////////////////////////////////////////////
function left($str, $len, $charset="utf-8"){
      //如果截取长度小于等于0,则返回空
      if( !is_numeric($len) or $len <= 0 ){
            return "";
      }
      //如果截取长度大于总字符串长度,则直接返回当前字符串
      $sLen = strlen($str);
      if( $len >= $sLen ){
            return $str;
      }      
      //判断使用什么编码,默认为utf-8
      if ( strtolower($charset) == "utf-8" ){
            $len_step = 3; //如果是utf-8编码,则中文字符长度为3
      }else{
            $len_step = 2; //如果是gb2312或big5编码,则中文字符长度为2
      }      
      //执行截取操作
      $len_i = 0; //初始化计数当前已截取的字符串个数,此值为字符串的个数值(非字节数)
      $substr_len = 0; //初始化应该要截取的总字节数
      for( $i=0; $i < $sLen; $i++ ){
            if ( $len_i >= $len ) break; //总截取$len个字符串后,停止循环
            //判断,如果是中文字符串,则当前总字节数加上相应编码的中文字符长度
            if( ord(substr($str,$i,1)) > 0xa0 ){
                  $i += $len_step - 1;
                  $substr_len += $len_step;
            }else{ //否则,为英文字符,加1个字节
                  $substr_len ++;
            }
            $len_i ++;
      }
      $result_str = substr($str,0,$substr_len );
      return $result_str;
}

////////////////////////////////////////////////////////////////////
// 调用示例
////////////////////////////////////////////////////////////////////
$str = "Aa 简.12'‘{《-“,空格也算一个字符";
$num = 16; //截取字符串的个数
echo "源字符串:".$str."<br><br>";
echo "截取 $num 个字符串<br><br>";
//使用者自已根据页面所使用的编码选择下面的调用方式
echo "截取后的字符串:".left($str,$num); //截取utf-8编码的字符串
//echo "截取后的字符串:".left($str, $num, "gb2312"); //截取gb2312编码的字符串
//echo "截取后的字符串:".left($str, $num, "big5"); //截取big5编码的字符串
?>
文章来源:桂林唯创网络
免责声明:本站相关技术文章信息部分来自网络,目的主要是传播更多信息,如果您认为本站的某些信息侵犯了您的版权,请与我们联系,我们会即时妥善的处理,谢谢合作!