估计不少玩smarty模板的小朋友都遇到过裁切乱码问题。特别是UTF8编码的。
以下代码保存为modifier.truncate2.php 存到smarty libs下的plugin目录下
然后裁剪的时候用$v->conte本文来源gaodai$ma#com搞$$代**码)网8搞代gaodaima码nt|truncate2:100
就搞定了。
如果不好用可能是缓存导致,请速度删除templates_c下的缓存文件(小编搞的时候遇到缓存问题。)
<?php<BR>/**<BR> * Smarty plugin<BR> * @package Smarty<BR> * @subpackage plugins<BR> */<br><br> <BR>/**<BR> * Smarty truncate modifier plugin<BR> *<BR> * Type: modifier<br><BR> * Name: truncate<br><BR> * Purpose: Truncate a string to a certain length if necessary,<BR> * optionally splitting in the middle of a word, and<BR> * appending the $etc string or inserting $etc into the middle.<BR> * @link http://smarty.php.net/manual/en/language.modifier.truncate.php<BR> * truncate (Smarty online manual)<BR> * @author Monte Ohrt <BR> * @param string<BR> * @param integer<BR> * @param string<BR> * @param boolean<BR> * @param boolean<BR> * @return string<BR> */<BR>function smarty_modifier_truncate2( $string,$length = 80,$etc='...',$count_words = true ) {<BR> return $returnstr =substr_utf8($string, 0, $length).$etc; <br><br>}<br><br>function substr_utf8($str, $start=0, $length=-1, $return_ary=false) {<BR> $len = strlen($str);if ($length == -1) $length = $len;<BR> $r = array();<BR> $n = 0;<BR> $m = 0;<br><br> for($i = 0; $i < $len; $i++) {<BR> $x = substr($str, $i, 1);<BR> $a = base_convert(ord($x), 10, 2);<BR> $a = substr('00000000'.$a, -8);<BR> if ($n < $start) {<BR> if (substr($a, 0, 1) == 0) {<BR> }elseif (substr($a, 0, 3) == 110) {<BR> $i += 1;<BR> }elseif (substr($a, 0, 4) == 1110) {<BR> $i += 2;<BR> }<BR> $n++;<BR> }else {<BR> if (substr($a, 0, 1) == 0) {<BR> $r[] = substr($str, $i, 1);<BR> }elseif (substr($a, 0, 3) == 110) {<BR> $r[] = substr($str, $i, 2);<BR> $i += 1;<BR> }elseif (substr($a, 0, 4) == 1110) {<BR> $r[] = substr($str, $i, 3);<BR> $i += 2;<BR> }else {<BR> $r[] = '';<BR> }<BR> if (++$m >= $length) {<BR> break;<BR> }<BR> }<BR> }<br><br> return $return_ary ? $r : implode("",$r);<BR>}<BR>/* vim: set expandtab: */<BR>?>
samrty的插件体系还是比较智能而且容易修改的。