+ -
当前位置:首页 → 问答吧 → Smarty模板扩展函数之 中文字符截取

Smarty模板扩展函数之 中文字符截取

时间:2006-07-30

来源:互联网

我是在做cms系统时碰到有这个需求的,一查文档,可以自己扩展函数,欣喜。


hbcms模板应用增加了截取函数 cn_truncate

函数目的:
1。在模板中直接截取中文字符
2。可保留原来的字符串style,如 font 等


用法:
cn_truncate 用法大致同官方的 truncate 函数,如下:

<{$item_info.title|cn_truncate:18:"...":true}>

第1个参数 18 表示截取 18 个汉字

第2个参数 ... 表示,如果多余18个汉字,则显示 ...

第3个参数 true 表示保留文字的初始颜色。 false 表示去掉颜色。

已知的BUG:
只做到了保留第一个style,而且有BUG(可查考源代码),请高手完善。

本函数的最新完善版本可在  http://hbcms.com/cms/template/  中下载


源代码如下:
复制内容到剪贴板
代码:
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/


/**
* Smarty truncate modifier plugin
*
* Type:     modifier<br>
* Name:     truncate<br>
* Purpose:  Truncate a string to a certain length if necessary,
*           optionally splitting in the middle of a word, and
*           appending the $etc string or inserting $etc into the middle.
* @link         http://www.hbcms.com/
* @author   http://www.hbcms.com/
* @param string
* @param integer
* @param string
* @param boolean $keep_first_style 是否保留第一个style
* @return string

* $keep_first_style 理解范例:

$s = '<A HREF="http://www.hbcms.com/"><FONT COLOR="red"><U><B>宏博<U>内容</U>管<B>理</B>系 &nbsp;统&nbsp;
<P>
<FONT SIZE="2" COLOR="blue">HBCMS</FONT> 是一个可以免费使用的内容管理系统,您甚至可以用<A HREF="http://www.hbcms.com/">她来做商业网站</A>。点这里查看详细版权说明

<BR>&nbsp;<BR>
是否有错误
<HR>
已知bug,截取:<FONT SIZE="2" COLOR="blue">乌木乌木乌<U>木乌木</U>乌木乌木乌木乌木乌木</font>有异常
<P>
希望大家改善</B></U></FONT></A>';
echo $s . '<hr><HR><HR>smarty_modifier_cn_truncate:<HR>';
echo smarty_modifier_cn_truncate($s,30,'。。。',1);
exit();
*/

function smarty_modifier_cn_truncate($string, $strlen = 20, $etc = '...',
                                  $keep_first_style = false)
{
        $strlen = $strlen*2;
        $string = trim($string);
        if ( strlen($string) <= $strlen )        {
                return $string;
        }
        $str = strip_tags($string);
        $j = 0;
    for($i=0;$i<$strlen;$i++) {
      if(ord(substr($str,$i,1))>0xa0) $j++;
        }
    if($j%2!=0) $strlen++;
    $rstr=substr($str,0,$strlen);
    if (strlen($str)>$strlen  ) {$rstr .= $etc;}

        if ( $keep_first_style == true && ereg('^<(.*)>$',$string) )        {
                if ( strlen($str) <= $strlen )        {
                        return $string;
                }
                $start_pos = strpos($string,substr($str,0,4));
                $end_pos = strpos($string,substr($str,-4));
                $end_pos = $end_pos+4;
                $rstr = substr($string,0,$start_pos) . $rstr . substr($string,$end_pos,strlen($string));
        }

    return $rstr;

}

/* vim: set expandtab: */

?>
[ 本帖最后由 hbcms 于 2006-7-30 15:52 编辑 ]

作者: hbcms   发布时间: 2006-07-30

不错,很有用

作者: xiaojia   发布时间: 2006-08-24

是啊 ,我也遇到类似问题,只好用css来控制

作者: leobyrds   发布时间: 2006-09-19

想发图片割好的代码,发现不行,郁闷,只好回文本的
复制内容到剪贴板
代码:
function cutstr($string, $length) {
$strcut = '';
if(strlen($string) > $length) {
  for($i = 0; $i < $length - 3; $i++) {
   $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
  }
  return $strcut.' ...';
}
else {
  return $string;
}
}
代码少多了吧!

作者: phpvista   发布时间: 2006-10-20