THINKPHP截取中文字符串函数

作者:袖梨 2022-06-25

THINKPHP中已经准备好的字符串截取函数。

ThinkPHP 官方扩展的 msubstr 方法其实挺好的,但有以下几个问题:

1,调用的时候会多次判断,包括2次判断是否自带了 mb_substr 和 iconv_substr 函数;
2,无论是否超出长度,如果有 $suffix=true 都会追加省略号,这个不太合理;

介于以上两点,并且在确保自己的服务器支持 mb_substr 函数、并且都是 utf-8 编码的情况下,我们其实可以自己在 Common/common.php(3.2 版本中为 function.php) 中自己添加一个 subtext 的函数,代码如下:
function subtext($text, $length)
 {
    if(mb_strlen($text, 'utf8') > $length)
    return mb_substr($text, 0, $length, 'utf8').'...';
    return $text;
 }
 
这样在模版中调用的话,只需要用 {$vo.title|subtext=10} 这样即可,同时实现了,如果没超出长度,则不追加省略号的效果。

# 函数解释:
msubstr($str, $start=0, $length, $charset=”utf-8″, $suffix=true)
/*
$str:要截取的字符串
$start=0:开始位置,默认从0开始
$length:截取长度
$charset=”utf-8″:字符编码,默认UTF-8
$suffix=true:是否在截取后的字符后面显示省略号,默认true显示,false为不显示
*/

模版使用:

{$vo.title|msubstr=0,5,'utf-8',false}


Ps:若是核心版的可能不存在该函数,不用怕,逐风把代码给大家贴出来:

function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) 

 if(function_exists("mb_substr")){ 
  if($suffix) 
   return mb_substr($str, $start, $length, $charset)."..."; 
  else
   return mb_substr($str, $start, $length, $charset); 
 } 
 elseif(function_exists('iconv_substr')) { 
  if($suffix) 
   return iconv_substr($str,$start,$length,$charset)."..."; 
  else
   return iconv_substr($str,$start,$length,$charset); 
 } 
 $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)); 
 if($suffix) return $slice."…"; 
 return $slice;
}

相关文章

精彩推荐