前段用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个汉字了!

 

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

  1. thinkphp5 模板中截取中文字符串

    TP5模板页截取中文字符串 {$vo.task_detail|mb_substr=###,0,15,'utf-8'}

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

    注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|function1|function2=arg1,arg2,### ...

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

    1.number_format {$number|number_format=2}   千分位,保留两位小数 2.round {$number|round=2}   四舍五入保留两位小数

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

    1.Thinkphp 模板中直接对数据处理:{$data.name|substr=0,3} 2.中文字符串截取函数:mb_substr=0,14,'utf-8' 3.中文字符串统计:iconv_str ...

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

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  6. (实用篇)php中计算中文字符串长度、截取中文字符串的函数代码

    在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启.当然,如果是用的自己的服务 ...

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

    在做PHP开发的时候,由于我国的语言环境问题,所以我们常常需要对中文进行处理.在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数 ...

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

    今天学习了php函数截取中文字符串,英文字符串,中英文字符串的函数使用方法.对中英文截取方法不理解,此处先做记录. PHP自带的函数如strlen().mb_strlen()都是通过计算字符串所占字节 ...

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

    PHP截取中文字符串不出现?号的解决方法[原创] 大 | 中 | 小 [不指定 -- : | by 张宴 ] [文章作者:张宴 本文版本:v1. 最后修改: 转载请注明出处:http://blog.z ...

随机推荐

  1. linux设备模型_转

    建议原博文查看,效果更佳. 转自:http://www.cnblogs.com/wwang/category/269350.html Linux设备模型 (1) 随着计算机的周边外设越来越丰富,设备管 ...

  2. DLL项目报错:fatal error lnk1104: cannot open file "...\xxx.dll"

    在生成DLL的时候报这个错, 生成不了DLL 检查生成DLL的路径是否有其他程序在使用... 或者把杀毒软件关了试试...

  3. 12C清理asm磁盘组和文件

    磁盘清理(disk scrub)可以检查逻辑坏块,并使用镜像数据自动修复数据(必须是normal.high冗余级别).磁盘清理过程和磁盘组的rebalance相结合,可以减少对I/O资源的使用.清理过 ...

  4. Autowired注解的妙用---在Controller里的构造函数里获取需要注入的对象

    /*@Resource private Observer<TaxiObserverVo> taxiPushObserver; @Resource private Observer<T ...

  5. 安装windowbuilder错误一例

    eclipse是3.7版本,安装了windowbuilder,大致步骤如下: http://www.cnblogs.com/gladto/archive/2011/07/21/2112836.html ...

  6. [原创]Scala学习:for,function,lazy

    1.for循环是一个循环控制结构,可以有效地编写需要执行的特定次数的循环.Scalar的循环说明如下的各种形式: 1)Scala中for循环最简单的语法是: for( var x <- Rang ...

  7. Python学习总结13:os模块

    os模块包含普遍的操作系统功能,与具体的平台无关.常用于处理文件和目录这些我们日常手动需要做的操作. 1. os模块函数汇总 1) os.name():判断现在正在实用的平台,Windows 返回 ‘ ...

  8. Java基础(43):Java中的Object类与其方法(转)

    Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...

  9. Nopi .net下面的Excel第三方dll

    相关参考资料:1.npoi官网:http://npoi.codeplex.com/2.用NPOI操作EXCEL--插入图片:  http://www.cnblogs.com/atao/archive/ ...

  10. vs2003打包

    怎样将.Net程序部署到没有安装.Net Framwork的机器上? 部署在.Net 平台下开发的应用程序,需要安装安装对应版本的.Net Framwork,而Vsual Studio 2003并没有 ...