Discuz教程网

PHP中计算中文字符串长度、截取中文字符串的函数代码

[复制链接]
authicon dly 发表于 2011-9-2 21:39:49 | 显示全部楼层 |阅读模式
在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启。当然,如果是用的自己的服务器,则只要在php.ini中开启即可。如果是用的虚拟主机,而服务器又没有开启这方面的函数的话,那就需要我们自己写出点适合咱国情的函数来了。
以下几个函数用起来颇为顺手的。不过要知道,得在utf-8环境下使用。
代码如下:


  1. header('Content-type:text/html;charset=utf-8');
  2. /**
  3. * 可以统计中文字符串长度的函数
  4. * @param $str 要计算长度的字符串
  5. * @param $type 计算长度类型,0(默认)表示一个中文算一个字符,1表示一个中文算两个字符
  6. *
  7. */
  8. function abslength($str)
  9. {
  10. if(empty($str)){
  11. return 0;
  12. }
  13. if(function_exists('mb_strlen')){
  14. return mb_strlen($str,'utf-8');
  15. }
  16. else {
  17. preg_match_all("/./u", $str, $ar);
  18. return count($ar[0]);
  19. }
  20. }
  21. $str = '我们都是中国人啊,ye!';
  22. $len = abslength($str);
  23. var_dump($len); //return 12
  24. $len = abslength($str,'1');
  25. echo '<br />'.$len; //return 22
  26. /*
  27. utf-8编码下截取中文字符串,参数可以参照substr函数
  28. @param $str 要进行截取的字符串
  29. @param $start 要进行截取的开始位置,负数为反向截取
  30. @param $end 要进行截取的长度
  31. */
  32. function utf8_substr($str,$start=0) {
  33. if(empty($str)){
  34. return false;
  35. }
  36. if (function_exists('mb_substr')){
  37. if(func_num_args() >= 3) {
  38. $end = func_get_arg(2);
  39. return mb_substr($str,$start,$end,'utf-8');
  40. }
  41. else {
  42. mb_internal_encoding("UTF-8");
  43. return mb_substr($str,$start);
  44. }
  45. }
  46. else {
  47. $null = "";
  48. preg_match_all("/./u", $str, $ar);
  49. if(func_num_args() >= 3) {
  50. $end = func_get_arg(2);
  51. return join($null, array_slice($ar[0],$start,$end));
  52. }
  53. else {
  54. return join($null, array_slice($ar[0],$start));
  55. }
  56. }
  57. }
  58. $str2 = 'wo要截取zhongwen';
  59. echo '<br />';
  60. echo utf8_substr($str2,0,-4); //return wo要截取zhon

  61. 支持gb2312,gbk,utf-8,big5 中文截取方法

  62. 代码如下:

  63. /*
  64. * 中文截取,支持gb2312,gbk,utf-8,big5
  65. *
  66. * @param string $str 要截取的字串
  67. * @param int $start 截取起始位置
  68. * @param int $length 截取长度
  69. * @param string $charset utf-8|gb2312|gbk|big5 编码
  70. * @param $suffix 是否加尾缀
  71. */
  72. public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
  73. {
  74. if(function_exists("mb_substr"))
  75. {
  76. if(mb_strlen($str, $charset) <= $length) return $str;
  77. $slice = mb_substr($str, $start, $length, $charset);
  78. }
  79. else
  80. {
  81. $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  82. $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  83. $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  84. $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  85. preg_match_all($re[$charset], $str, $match);
  86. if(count($match[0]) <= $length) return $str;
  87. $slice = join("",array_slice($match[0], $start, $length));
  88. }
  89. if($suffix) return $slice."…";
  90. return $slice;
  91. }
复制代码







上一篇:抱歉,您的 IP 地址不在被允许,或您的账号被禁用,无法访问本站点 怎么解决
下一篇:PHP数据结构 算法(PHP描述) 简单选择排序 simple selection sort
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 20:10

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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