用户名: 密码: 忘记密码? 注册
收藏此问题 发表新评论

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

我是在做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/  中下载


源代码如下:



  1. <?php
  2. /**
  3. * Smarty plugin
  4. * @package Smarty
  5. * @subpackage plugins
  6. */


  7. /**
  8. * Smarty truncate modifier plugin
  9. *
  10. * Type:     modifier<br>
  11. * Name:     truncate<br>
  12. * Purpose:  Truncate a string to a certain length if necessary,
  13. *           optionally splitting in the middle of a word, and
  14. *           appending the $etc string or inserting $etc into the middle.
  15. * @link         http://www.hbcms.com/
  16. * @author   http://www.hbcms.com/
  17. * @param string
  18. * @param integer
  19. * @param string
  20. * @param boolean $keep_first_style 是否保留第一个style
  21. * @return string

  22. * $keep_first_style 理解范例:

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

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

  36. function smarty_modifier_cn_truncate($string, $strlen = 20, $etc = '...',
  37.                                   $keep_first_style = false)
  38. {
  39.         $strlen = $strlen*2;
  40.         $string = trim($string);
  41.         if ( strlen($string) <= $strlen )        {
  42.                 return $string;
  43.         }
  44.         $str = strip_tags($string);
  45.         $j = 0;
  46.     for($i=0;$i<$strlen;$i++) {
  47.       if(ord(substr($str,$i,1))>0xa0) $j++;
  48.         }
  49.     if($j%2!=0) $strlen++;
  50.     $rstr=substr($str,0,$strlen);
  51.     if (strlen($str)>$strlen  ) {$rstr .= $etc;}

  52.         if ( $keep_first_style == true && ereg('^<(.*)>$',$string) )        {
  53.                 if ( strlen($str) <= $strlen )        {
  54.                         return $string;
  55.                 }
  56.                 $start_pos = strpos($string,substr($str,0,4));
  57.                 $end_pos = strpos($string,substr($str,-4));
  58.                 $end_pos = $end_pos+4;
  59.                 $rstr = substr($string,0,$start_pos) . $rstr . substr($string,$end_pos,strlen($string));
  60.         }

  61.     return $rstr;

  62. }

  63. /* vim: set expandtab: */

  64. ?>


复制代码

[ 本帖最后由 hbcms 于 2006-7-30 15:52 编辑 ]
昵称: hbcms  时间: 2006-07-30 15:49:31
不错,很有用
昵称: xiaojia  时间: 2006-08-24 11:19:08
是啊 ,我也遇到类似问题,只好用css来控制
昵称: leobyrds  时间: 2006-09-19 11:13:23
想发图片割好的代码,发现不行,郁闷,只好回文本的
  1. function cutstr($string, $length) {
  2. $strcut = '';
  3. if(strlen($string) > $length) {
  4.   for($i = 0; $i < $length - 3; $i++) {
  5.    $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
  6.   }
  7.   return $strcut.' ...';
  8. }
  9. else {
  10.   return $string;
  11. }
  12. }
复制代码

代码少多了吧!
昵称: phpvista  时间: 2006-10-20 19:50:55
tukiz14 tukiz14
昵称: ieliwb  时间: 2008-11-26 14:34:04
感觉还不错,好多年不用这个smarty模版了
昵称: wang15109133  时间: 2012-12-31 17:39:43
学习了~
昵称: zdenfey  时间: 2013-06-06 17:45:47
发表评论
昵称:
内容:
验证: