免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4348 | 回复: 3
打印 上一主题 下一主题

php中如何截取中文字符串? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-18 12:46 |只看该作者 |倒序浏览
转:乙醇

php中如何截取中文字符串?





众所周知php原生函数substr是不支持截取中文字符串的。下面的代码提供了多种截取php中文字符串的方法。

1. 截取GB2312中文字符串
  1. <?php

  2. < ?php
  3. //截取中文字符串
  4. function mysubstr($str, $start, $len) {
  5.     $tmpstr = "";
  6.     $strlen = $start + $len;
  7.     for($i = 0; $i < $strlen; $i++) {
  8.         if(ord(substr($str, $i, 1)) > 0xa0) {
  9.             $tmpstr .= substr($str, $i, 2);
  10.             $i++;
  11.         } else
  12.             $tmpstr .= substr($str, $i, 1);
  13.     }
  14.     return $tmpstr;
  15. }
  16. ?>
复制代码
2. 截取utf8编码的多字节字符串
  1. <?php
  2. < ?php
  3. //截取utf8字符串
  4. function utf8Substr($str, $from, $len)
  5. {
  6.     return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
  7.                        '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
  8.                        '$1',$str);
  9. }
  10. ?>
复制代码
3. UTF-8、GB2312都支持的汉字截取函数
  1. <?php
  2. < ?php
  3. /*
  4. Utf-8、gb2312都支持的汉字截取函数
  5. cut_str(字符串, 截取长度, 开始长度, 编码);
  6. 编码默认为 utf-8
  7. 开始长度默认为 0
  8. */

  9. function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
  10. {
  11.     if($code == 'UTF-8')
  12.     {
  13.         $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/";
  14.         preg_match_all($pa, $string, $t_string);

  15.         if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."...";
  16.         return join('', array_slice($t_string[0], $start, $sublen));
  17.     }
  18.     else
  19.     {
  20.         $start = $start*2;
  21.         $sublen = $sublen*2;
  22.         $strlen = strlen($string);
  23.         $tmpstr = '';

  24.         for($i=0; $i< $strlen; $i++)
  25.         {
  26.             if($i>=$start && $i< ($start+$sublen))
  27.             {
  28.                 if(ord(substr($string, $i, 1))>129)
  29.                 {
  30.                     $tmpstr.= substr($string, $i, 2);
  31.                 }
  32.                 else
  33.                 {
  34.                     $tmpstr.= substr($string, $i, 1);
  35.                 }
  36.             }
  37.             if(ord(substr($string, $i, 1))>129) $i++;
  38.         }
  39.         if(strlen($tmpstr)< $strlen ) $tmpstr.= "...";
  40.         return $tmpstr;
  41.     }
  42. }

  43. $str = "abcd需要截取的字符串";
  44. echo cut_str($str, 8, 0, 'gb2312');
  45. ?>
复制代码
4. BugFree 的字符截取函数

  1. < ?php
  2. /**
  3. * @package     BugFree
  4. * @version     $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $
  5. *
  6. *
  7. * Return part of a string(Enhance the function substr())
  8. *
  9. * @author                  Chunsheng Wang <wwccss@263.net>
  10. * @param string  $String  the string to cut.
  11. * @param int     $Length  the length of returned string.
  12. * @param booble  $Append  whether append "...": false|true
  13. * @return string           the cutted string.
  14. */
  15. function sysSubStr($String,$Length,$Append = false)
  16. {
  17.     if (strlen($String) < = $Length )
  18.     {
  19.         return $String;
  20.     }
  21.     else
  22.     {
  23.         $I = 0;
  24.         while ($I < $Length)
  25.         {
  26.             $StringTMP = substr($String,$I,1);
  27.             if ( ord($StringTMP) >=224 )
  28.             {
  29.                 $StringTMP = substr($String,$I,3);
  30.                 $I = $I + 3;
  31.             }
  32.             elseif( ord($StringTMP) >=192 )
  33.             {
  34.                 $StringTMP = substr($String,$I,2);
  35.                 $I = $I + 2;
  36.             }
  37.             else
  38.             {
  39.                 $I = $I + 1;
  40.             }
  41.             $StringLast[] = $StringTMP;
  42.         }
  43.         $StringLast = implode("",$StringLast);
  44.         if($Append)
  45.         {
  46.             $StringLast .= "...";
  47.         }
  48.         return $StringLast;
  49.     }
  50. }

  51. $String = "17test.info 走在中国自动化测试的前沿";
  52. $Length = "18";
  53. $Append = false;
  54. echo sysSubStr($String,$Length,$Append);
  55. ?>
复制代码

评分

参与人数 1可用积分 +30 信誉积分 -30 收起 理由
fanglq04 + 30 -30 我很赞同

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2011-07-20 17:01 |只看该作者
这个好

评分

参与人数 1可用积分 +1 收起 理由
fanglq04 + 1 hao

查看全部评分

论坛徽章:
0
3 [报告]
发表于 2011-07-20 17:31 |只看该作者
用mb_string 啊

论坛徽章:
0
4 [报告]
发表于 2011-07-22 09:40 |只看该作者
非常全面,比直接用substr高级很多,http://www.91penwu.com/
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP