thinkphp模板中截取中文字符串的方法分享

前段用thinkphp写了一个系统,感觉thinkphp学起来比较容易,开发起来了比较顺手,其中一个关键的因素就是它的模版引擎相当强大,使用方法跟smarty类似,在模版中还可以用php代码,有模版包含、继承的等很多好的功能……

但是我发现thinkphp在模版函数中,没有中文字符串的截取函数,有个substr可以截取,但是不是基于中文的,当使用utf8编码的时候,由于3个字符代表一个中文,如果想截取的内容混杂中文/数字/英文字符串的时候就会出问题,最后一个字符很有可能混乱,这个问题很头大。于是我到处寻找解决问题的方法,果然有很多大虾给出解决的方法,现在给大家推荐一种我觉得很好用的方法。不过对这个方法我还是有些顾忌,原因是这个方法修改到thinkphp的库文件,这种做法在框架开发中是很不推荐的。说明这点也希望大家先考虑这种方法是否可取,当然如果有什么更好的方法希望高手不吝赐教。

好了,废话不说了,以下是这个方法的使用方法:

打开thinkphp库文件:ThinkPHP/Common/common.php文件,在文件的末尾加入以下函数:

/**
 * 截取中文字符串
 */
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=false){
 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;
}

就是这么简单,然后在模版中你就可以使用这个函数了,实例:

{$title|msubstr=0,21}

强调一点是,这里的21代表21个中文汉字,而不是sbustr中的21代表7个汉字了!

时间: 2024-10-14 00:48:36

thinkphp模板中截取中文字符串的方法分享的相关文章

Thinkphp模板中使用自定义函数的方法

注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### } 说明: { 和 $ 符号之间不能有空格,后面参数的空格就没有问题: ###表示模板变量本身的参数位置 : 支持多个函数,函数之间支持空格 : 支持函数屏蔽功能,在配置文件中可以配置禁止使用的函数列表 : 支持变量缓存功能,重复变量字串不多次解析. 使用例子: {$webTitle|md5|st

Thinkphp 模板中直接对数据处理 模板中使用函数 中文字符串截取

1.Thinkphp 模板中直接对数据处理:{$data.name|substr=0,3} 2.中文字符串截取函数:mb_substr=0,14,'utf-8' 3.中文字符串统计:iconv_strlen(字符串,"UTF-8") <div style="margin-bottom: 8px;"> <a href="#" target="_blank" class="my_a" >

ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: 对于字符串的截取,truncate函数只适合英文用户,对与中文用户来说,使用 truncate会出现乱码,而且对于中文英文混合串来说,截取同样个数的字符串,实际显示长度上却不同,一个中文的长度大致相当于两个英文的长度.此外,truncate不能同时兼容GB2312.UTF-8等编码. 解决方法:自

PHP截取中文字符串不出现?号的解决方法[原创]

PHP截取中文字符串不出现?号的解决方法[原创] 大 | 中 | 小 [不指定 2007-8-15 18:51 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2007.08.15 转载请注明出处:http://blog.zyan.cc] 当PHP截取中英文混合字符串时,最后一个汉字经常被拆成两半,例:截取字符串的前18个字 view plainprint? <?php $text = "1欢迎访问sina新浪播客"; $value = substr($tex

php中计算中文字符串长度、截取中文字符串

在做PHP开发的时候,由于我国的语言环境问题,所以我们常常需要对中文进行处理.在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启.当然,如果是用的自己的服务器,则只要在php.ini中开启即可.如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了. 以下几个函数用起来颇为顺手的.不过要知道,得在utf-8环境下使用. header

php截取中文字符串,英文字符串,中英文字符串长度的方法

今天学习了php函数截取中文字符串,英文字符串,中英文字符串的函数使用方法.对中英文截取方法不理解,此处先做记录. PHP自带的函数如strlen().mb_strlen()都是通过计算字符串所占字节数来统计字符串长度的,一个英文字符占1字节.例: $enStr = ‘Hello,China!’;echo strlen($enStr); // 输出:12 而中文则不然,做中文网站一般会选择两种编码:gbk/gb2312或是utf-8.utf-8能兼容更多的字符,所以受到很多站长的喜爱.gbk与u

thinkphp模板中使用函数的方法

1.执行函数并输出返回值:格式:{:function(-)} 例如,输出U函数的返回值: {:U('User/insert')} 编译后的PHP代码是 <?php echo U('User/insert');?> 2.执行函数但不输出 : 格式:{~function(-)} 例如,调用say_hello函数: {~say_hello('ThinkPHP')} 编译后的PHP代码是: <?php say_hello('ThinkPHP');?> thinkphp模板中使用函数的方法

PHP截取中文字符串方法总结

PHP截取中文字符串有时会出现乱码 使用一下三种方式解决乱码: <?php @header('Content-type: text/html; charset=UTF-8'); $arr = "sa撒的发dfa多少sfd看sdf得12上24飞452机[email protected]$#^辣^&%椒粉b"; /****************************************************************** * 程序一:PHP截取中文字符

thinkphp模板中foreach循环没数据的错误解决

从控制器方法中$this->assign();函数将值传递给html模板 但是模板不显示数据,直接出来的是代码,效果就和html中写了php代码不能解析一样. 原来是我将thinkphp框架的引擎和smarty模板引擎的使用方法混了.写成了 查手册知道了thinkphp模板中foreach的使用方法,这才恍然大悟