Fork me on github

自定义方法中英文字符截取

//方法一:(借鉴于thinkphp中的中英文字符截取)

function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) {
  if(function_exists("mb_substr"))
    $slice = mb_substr($str, $start, $length, $charset);
  elseif(function_exists('iconv_substr')) {
    $slice = iconv_substr($str,$start,$length,$charset);
    if(false === $slice) {
      $slice = '';
    }
  }else{
    $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
    $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
    $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
    $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
    preg_match_all($re[$charset], $str, $match);
    $slice = join("",array_slice($match[0], $start, $length));
  }
  return $suffix ? $slice.'...' : $slice;
}

//方法二:(借鉴于phpcms中的中英文截取)
 
function str_cut($string, $length, $dot = '...') {
  $strlen = strlen($string);
  if($strlen <= $length) return $string;
  $string = str_replace(array(' ',' ', '&', '"', ''', '', '', '', '<', '>', '·', ''), array('',' ', '&', '"', "'", '', '', '', '<', '>', '·', ''), $string);
  $strcut = '';
  if(strtolower(CHARSET) == 'utf-8') {
    $length = intval($length-strlen($dot)-$length/3);
    $n = $tn = $noc = 0;
    while($n < strlen($string)) {
      $t = ord($string[$n]);
      if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
         $tn = 1; $n++; $noc++;
      } elseif(194 <= $t && $t <= 223) {
         $tn = 2; $n += 2; $noc += 2;
      } elseif(224 <= $t && $t <= 239) {
         $tn = 3; $n += 3; $noc += 2;
      } elseif(240 <= $t && $t <= 247) {
         $tn = 4; $n += 4; $noc += 2;
      } elseif(248 <= $t && $t <= 251) {
         $tn = 5; $n += 5; $noc += 2;
      } elseif($t == 252 || $t == 253) {
         $tn = 6; $n += 6; $noc += 2;
      } else {
         $n++;
      }
      if($noc >= $length) {
         break;
      }
    }
    if($noc > $length) {
      $n -= $tn;
    }
    $strcut = substr($string, 0, $n);
    $strcut = str_replace(array('', '&', '"', "'", '', '', '', '<', '>', '·', ''), array(' ', '&', '"', ''', '', '', '', '<', '>', '·', ''), $strcut);
  } else {
    $dotlen = strlen($dot);
    $maxi = $length - $dotlen - 1;
    $current_str = '';
    $search_arr = array('&',' ', '"', "'", '', '', '', '<', '>', '·', '','');
    $replace_arr = array('&',' ', '"', ''', '', '', '', '<', '>', '·', '',' ');
    $search_flip = array_flip($search_arr);
    for ($i = 0; $i < $maxi; $i++) {
      $current_str = ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
      if (in_array($current_str, $search_arr)) {
        $key = $search_flip[$current_str];
        $current_str = str_replace($search_arr[$key], $replace_arr[$key], $current_str);
      }
      $strcut .= $current_str;
    }
  }
  return $strcut.$dot;
}

 

posted @ 2015-08-31 09:47  Champion-水龙果  阅读(274)  评论(0编辑  收藏  举报
Champion-水龙果