立即注册 找回密码

QQ登录

只需一步,快速开始

查看: 6290|回复: 0

[Discuz 开发教程] Discuz模板中使用cutstr来截取字符串的方法和原理

[复制链接]
发表于 2015-1-16 14:33:45 | 显示全部楼层 |阅读模式
道勤网-数据www.daoqin.net

亲注册登录道勤网-可以查看更多帖子内容哦!(包涵精彩图片、文字详情等)请您及时注册登录-www.daoqin.net

您需要 登录 才可以下载或查看,没有账号?立即注册

x
discuz写模板的时候需要对字符串进行截取,可以使用cutstr方法来截取。请看实现代码:
<!--{eval echo cutstr($value['subject'],30,'');}-->

cutstr方法代码如下
  1. /**
  2. * [discuz] 基于PHP没有安装 mb_substr 等扩展截取字符串,如果截取中文字则按2个字符计算
  3. * @param $string 要截取的字符串
  4. * @param $length 要截取的字符数
  5. * @param $dot 替换截掉部分的结尾字符串
  6. * @return 返回截取后的字符串
  7. */
  8. function cutstr($string, $length, $dot = '...') {
  9. // 如果字符串小于要截取的长度则直接返回
  10. // 此处使用strlen获取字符串长度有很大的弊病,比如对字符串“新年快乐”要截取4个中文字符,
  11. // 那么必须知道这4个中文字符的字节数,否则返回的字符串可能会是“新年快乐...”
  12. if (strlen($string) <= $length) {
  13. return $string;
  14. }

  15. // 转换原字符串中htmlspecialchars
  16. $pre = chr(1);
  17. $end = chr(1);
  18. $string = str_replace ( array ('&', '"', '<', '>' ), array ($pre . '&' . $end, $pre . '"' . $end, $pre . '<' . $end, $pre . '>' . $end ), $string );

  19. $strcut = ''; // 初始化返回值

  20. // 如果是utf-8编码(这个判断有点不全,有可能是utf8)
  21. if (strtolower ( CHARSET ) == 'utf-8') {
  22. // 初始连续循环指针$n,最后一个字位数$tn,截取的字符数$noc
  23. $n = $tn = $noc = 0;
  24. while ( $n < strlen ( $string ) ) {
  25. $t = ord ( $string [$n] );

  26. if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
  27. // 如果是英语半角符号等,$n指针后移1位,$tn最后字是1位
  28. $tn = 1;
  29. $n++;
  30. $noc++;
  31. } elseif (194 <= $t && $t <= 223) {
  32. // 如果是二字节字符$n指针后移2位,$tn最后字是2位
  33. $tn = 2;
  34. $n += 2;
  35. $noc += 2;
  36. } elseif (224 <= $t && $t <= 239) {
  37. // 如果是三字节(可以理解为中字词),$n后移3位,$tn最后字是3位
  38. $tn = 3;
  39. $n += 3;
  40. $noc += 2;
  41. } elseif (240 <= $t && $t <= 247) {
  42. $tn = 4;
  43. $n += 4;
  44. $noc += 2;
  45. } elseif (248 <= $t && $t <= 251) {
  46. $tn = 5;
  47. $n += 5;
  48. $noc += 2;
  49. } elseif ($t == 252 || $t == 253) {
  50. $tn = 6;
  51. $n += 6;
  52. $noc += 2;
  53. } else {
  54. $n++;
  55. }

  56. // 超过了要取的数就跳出连续循环
  57. if ($noc >= $length) {
  58. break;
  59. }
  60. }

  61. // 这个地方是把最后一个字去掉,以备加$dot
  62. if ($noc > $length) {
  63. $n -= $tn;
  64. }

  65. $strcut = substr ( $string, 0, $n );

  66. } else {
  67. // 并非utf-8编码的全角就后移2位
  68. for ($i = 0; $i < $length; $i ++) {
  69. $strcut .= ord ( $string [$i] ) > 127 ? $string [$i] . $string [++ $i] : $string [$i];
  70. }
  71. }

  72. // 再还原最初的htmlspecialchars
  73. $strcut = str_replace( array ($pre . '&' . $end, $pre . '"' . $end, $pre . '<' . $end, $pre . '>' . $end ), array ('&', '"', '<', '>' ), $strcut );

  74. $pos = strrpos ( $strcut, chr ( 1 ) );
  75. if ($pos !== false) {
  76. $strcut = substr ( $strcut, 0, $pos );
  77. }

  78. return $strcut . $dot; // 最后把截取加上$dot输出
  79. }
复制代码


道勤主机提供365天*24小时全年全天无休、实时在线、零等待的售后技术支持。竭力为您免费处理您在使用道勤主机过程中所遇到的一切问题! 如果您是道勤主机用户,那么您可以通过QQ【792472177】、售后QQ【59133755】、旺旺【诠释意念】、微信:q792472177免费电话、后台提交工单这些方式联系道勤主机客服! 如果您不是我们的客户也没问题,点击页面最右边的企业QQ在线咨询图标联系我们并购买后,我们为您免费进行无缝搬家服务,让您享受网站零访问延迟的迁移到道勤主机的服务!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

道勤网- 推荐内容!上一条 /2 下一条

!jz_fbzt! !jz_sgzt! !jz_xgzt! 快速回复 !jz_fhlb! !jz_lxwm! !jz_gfqqq!

关于我们|手机版|小黑屋|地图|【道勤网】-www.daoqin.net 软件视频自学教程|免费教程|自学电脑|3D教程|平面教程|影视动画教程|办公教程|机械设计教程|网站设计教程【道勤网】 ( 皖ICP备15000319号-1 )

GMT+8, 2024-11-26 04:15

Powered by DaoQin! X3.4 © 2016-2063 Dao Qin & 道勤科技

快速回复 返回顶部 返回列表