用cutstr来截取Discuz模板中字符串的方法和原理-Discuz教程下载

用cutstr来截取Discuz模板中字符串的方法和原理

开通本站Svip会员,全站资源免费下
Discuz模板的时候需要对字符串进行截取,可以使用cutstr方法来截取。请看实现代码:
  1. !--{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. }
复制代码

全部评论 0

您需要登录后才可以回帖 立即登录
登录
0
0
0
返回顶部