smarty中用truncate来截取含有中英文的字符串,可能会出现中文乱码问题、字符串截取长度不一问题,下面是新建个扩展函数,或修改原Truncate函数方法也可以的。
扩展smarty/plugins目录下自己新建一个文件,写个函数,
修改后的smartTruncate: 文件名:modifier.smartTruncate.php  内容如下:

<?php function smarty_modifier_smartTruncate($string, $length = 80, $etc = '...',$break_words = false, $middle = false) {     if ($length == 0)         return '';     if (smartStrlen($string) > $length) {
$length -= smartStrlen($etc);
if (!$break_words && !$middle) {
$string = preg_replace('/\s+?(\S+)?$/', '', smartSubstr($string, 0, $length+1));
}
if(!$middle) {
return smartSubstr($string, 0, $length).$etc;
} else {
return smartSubstr($string, 0, $length/2) . $etc . smartSubstr($string, -$length/2);
}
} else {
return $string;
}
} function smartDetectUTF8($string)
{
static $result = array(); if(! array_key_exists($key = md5($string), $result))
{
$utf8 = "
/^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)+$/xs
"; $result[$key] = preg_match(trim($utf8), $string);
} return $result[$key];
} function smartStrlen($string)
{
$result = 0; $number = smartDetectUTF8($string) ? 3 : 2; for($i = 0; $i < strlen($string); $i += $bytes) { $bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1; $result += $bytes > 1 ? 1.0 : 0.5;
} return $result;
} function smartSubstr($string, $start, $length = null)
{
$result = ''; $number = smartDetectUTF8($string) ? 3 : 2; if($start < 0)
{
$start = max(smartStrlen($string) + $start, 0);
} for($i = 0; $i < strlen($string); $i += $bytes)
{
if($start <= 0) { break; } $bytes = ord(substr($string, $i, 1)) > 127 ? $number : 1; $start -= $bytes > 1 ? 1.0 : 0.5;
} if(is_null($length))
{
$result = substr($string, $i);
}
else
{
for($j = $i; $j < strlen($string); $j += $bytes)
{
if($length <= 0) { break; } if(($bytes = ord(substr($string, $j, 1)) > 127 ? $number : 1) > 1)
{
if($length < 1.0)
{
break;
} $result .= substr($string, $j, $bytes);
$length -= 1.0;
}
else
{
$result .= substr($string, $j, 1);
$length -= 0.5;
}
}
} return $result;
}

2、以上代码完整实现了truncate的原有功能,而且可以同时兼容GB2312和UTF-8编码,在判断字符长度的时候,一个中文字符算1.0,一个英文字符算0.5,所以在截取子字符串的时候不会出现参差不齐的情况.
插件的使用方式没有特别之处,这里简单测试一下:
{$content|smartTruncate:5:”..”}($content等于”U陈N宇V衡S博C客N”)
显示:U陈N宇V.. (中文符号长度算1.0,英文符号长度算0.5,并且考虑省略符号的长度)

{$string|smartTruncate:”10″:”…”}
第一个为截取的字符长度,第二个为后缀字符
3.其他问题
错误:(secure mode) modifier smartTruncate is not allowed
这主要是你启用了smarty的$security功能
解决方法:
给smarty配置文件中加入允许使用的函数
$smarty->security_settings['MODIFIER_FUNCS'] = array(‘smartTruncate’);

转自:http://blog.unvs.cn/archives/smarty-truncate-substr-length.html

smarty中用truncate来截取中英文字符串及避免中文乱码问题的更多相关文章

  1. js截取中英文字符串、标点符号无乱码示例解读

    <script> function subString(str, len, hasDot) { var newLength = 0; var newStr = ""; ...

  2. 一句python,一句R︱python中的字符串操作、中文乱码、NaN情况

    一句python,一句R︱python中的字符串操作.中文乱码.NaN情况 先学了R,最近刚刚上手Python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句pytho ...

  3. JavaScript截取中英文字符串

    有时在显示某段文字的时候,可能会太长,影响我们页面的显示效果.如果仅是英文,那么我们可以用String.substring(start, end)函数就已经够用了.但是通常我们都会遇到既有英文,又有汉 ...

  4. PHP截取中英文字符串

    //如果字符串长度超过10,则截取并以省略号结尾 function sub($str){ $str=(string)$str; if( mb_strlen($str,'utf-8') >10){ ...

  5. 一句python,一句R︱python中的字符串操作、中文乱码

    先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. pandas可谓如雷贯耳,数据处理神器. 以下符号: = ...

  6. 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码

    首先 要明确指出一点: 编码方式是针对字符串转换之后的字节数组的,字符串并没有编码方式的概念,因为字符串不管是在什么编码页面下他只是一个对象,他只有字符的概念,不管页面编码方式是什么,他始终都是那几个 ...

  7. smarty使用小技巧——截取小技巧

    smarty截取字符串(末尾没有...)今天发现有个网页出现乱码,检查发现是用truncate()函数截取的字符串,truncate()函数对中文支持不好,随用mb_substr()函数替换trunc ...

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

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

  9. 用JS来实现于截取中英文混合字符串方法(转载)

    网站制作过程中,提示层文字超出,需要JS做字符串截取,但是呢,我们常常会烦恼文字中英文混合如何判断,因为我们知道在JS中 string.length这个值是不考虑中英文的,但是计算机对中英文的识别是  ...

随机推荐

  1. hadoop map端的超时参数

    目前集群上某台机器卡住导致出现大量的Map端任务FAIL,当定位到具体的机器上时,无法ssh或进去后terminal中无响应,退出的相关信息如下: [hadoop@xxx ~]$ Received d ...

  2. CentOS 7 安装Nginx 并配置自动启动

    1.官网下载安装包 http://nginx.org/en/download.html,选择适合Linux的版本,这里选择最新的版本,下载到本地后上传到服务器或者centos下直接wget命令下载. ...

  3. RESTful基础知识

    RESTful简介 互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写.翻译是"表现层状态转化". 如果一个架构符合RES ...

  4. SpringBoot+rest接口+swagger2生成API文档+validator+mybatis+aop+国际化

    代码地址:JillWen_SpringBootDemo mybatis 1. 添加依赖: <dependency> <groupId>org.mybatis.spring.bo ...

  5. @RestController的方法中 路径参数带.(点号)配置

    如下面这种//http://localhost:8080/api/v1/user/info/email/test@163.com @RequestMapping(value = "/info ...

  6. 巧用setTimeout函数设置程序后门

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. TextBox 设置数据源的自动补全输入字符串功能

    这个东西首先说明是不是自己原创,但是比较简单.所以讲起分享如下.主要是用到TextBox的自动补全属性,这个东西虽然自己以前经常用TextBox,但是补全从没接触过. 关键代码是在窗体载入时加载如下代 ...

  8. EF CodeFirst简单实例

    运行环境:VS2012,添加的EntityFramework为6.0.2 版本不用太关心,只要知道原理就行了: 基本代码就这几行: namespace ConsoleApplication1 {    ...

  9. Redis搭建(六):Redis持久化配置

    一.介绍 Redis的持久化有2种方式: Rdb快照 Aof日志 1. Rdb快照的配置选项 save 900 1 // 900内,有1条写入,则产生快照 save 300 1000 // 如果300 ...

  10. 解剖Nginx·自动脚本篇(5)编译器相关主脚本

    在 Nginx 的自动脚本中,auto/cc目录下的所有脚本都是用于编译器相关配置使用的.Nginx的出色跨平台性(Linux.Darwin.Solaris.Win32 等)就有这些脚本的贡献.该目录 ...