免费注册 查看新帖 |

Chinaunix

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

解决PHP截取中文字符串问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-06 13:46 |只看该作者 |倒序浏览
解决PHP截取中文字符串问题



PHP截取字符串如果是英文那很好办,直接用substr就行了,一般不会出现乱码.中文就有点麻烦了.
下面给出两种解决办法:
(一)直接使用Multi-Byte函数库的mb_substr();函数就行了,实例代码如下
  1. <?php  
  2. echo mb_substr($str, $start, $length, $encoding);
  3. echo "<br />";
  4. ?>
复制代码
这种方法简单,快速,安全,漂亮,诱惑...反正什么好词都可以形容它,但是,可惜我的GoDaddy主机不支持,所以得另寻出路
(二)自定义截取中文字符串函数,基本上就是仿照mb_substr写个函数,直接调用罢了,以下为我找到的代码,其实很简单
  1. <?php  
  2. function  substr_cn($string_input,$start,$length)
  3. {
  4.     /* 功能:
  5.      * 此算法用于截取中文字符串
  6.      * 函数以单个完整字符为单位进行截取,即一个英文字符和一个中文字符均表示一个单位长度
  7.      * 参数:
  8.      * 参数$string为要截取的字符串,
  9.      * 参数$start为欲截取的起始位置,
  10.      * 参数$length为要截取的字符个数(一个汉字或英文字符都算一个)
  11.      * 返回值:
  12.      * 返回截取结果字符串
  13.      * */
  14.     $str_input=$string_input;
  15.     $len=$length;
  16.     $return_str="";
  17.     //定义空字符串
  18.     for ($i=0;$i<2*$len+2;$i++)
  19.         $return_str=$return_str." ";
  20.     $start_index=0;
  21.     //计算起始字节偏移量
  22.     for ($i=0;$i<$start;$i++)
  23.     {
  24.         if (ord($str_input{$start_index}>=161))          //是汉语      
  25.         {
  26.             $start_index+=2;
  27.         }
  28.         else                                          //是英文
  29.         {
  30.             $start_index+=1;
  31.         }         
  32.     }     
  33.     $chr_index=$start_index;
  34.     //截取
  35.     for ($i=0;$i<$len;$i++)
  36.     {
  37.         $asc=ord($str_input{$chr_index});
  38.         if ($asc>=161)
  39.         {
  40.             $return_str{$i}=chr($asc);
  41.             $return_str{$i+1}=chr(ord($str_input{$chr_index+1}));
  42.             $len+=1; //结束条件加1
  43.             $i++;    //位置偏移量加1
  44.             $chr_index+=2;
  45.             continue;            
  46.         }
  47.         else  
  48.         {
  49.             $return_str{$i}=chr($asc);
  50.             $chr_index+=1;
  51.         }
  52.     }     
  53.     return trim($return_str);
  54. }//end of substr_cn
  55. ?>
复制代码
本文来自: http://www.likebeta.com/chinese- ... roblem-solving.html

论坛徽章:
0
2 [报告]
发表于 2011-04-06 17:24 |只看该作者
本帖最后由 a.a 于 2011-04-06 21:52 编辑

我的做法一般是先urlencode之后再进行,substr()

论坛徽章:
0
3 [报告]
发表于 2011-04-06 17:33 |只看该作者
本帖最后由 stabilization 于 2011-04-06 17:40 编辑

俺和楼上同做法

但是是substr

论坛徽章:
0
4 [报告]
发表于 2011-04-06 21:52 |只看该作者
回复 3# stabilization

唉,不小心打错了,谢谢指出。

论坛徽章:
54
2017金鸡报晓
日期:2017-02-08 10:39:42操作系统版块每日发帖之星
日期:2016-03-08 06:20:00操作系统版块每日发帖之星
日期:2016-03-07 06:20:00操作系统版块每日发帖之星
日期:2016-02-22 06:20:00操作系统版块每日发帖之星
日期:2016-01-29 06:20:00操作系统版块每日发帖之星
日期:2016-01-27 06:20:00操作系统版块每日发帖之星
日期:2016-01-20 06:20:00操作系统版块每日发帖之星
日期:2016-01-06 06:20:0015-16赛季CBA联赛之江苏
日期:2015-12-21 20:00:24操作系统版块每日发帖之星
日期:2015-12-21 06:20:00IT运维版块每日发帖之星
日期:2015-11-17 06:20:002015亚冠之广州恒大
日期:2015-11-12 10:58:02
5 [报告]
发表于 2011-04-06 22:45 |只看该作者
楼主的函数可以对UTF-8的汉字进行截取吗?

论坛徽章:
0
6 [报告]
发表于 2011-04-07 10:01 |只看该作者
不截取直接显示隐藏

论坛徽章:
0
7 [报告]
发表于 2011-04-07 15:15 |只看该作者
回复 4# a.a


    客气啦,知道是你打错的

论坛徽章:
0
8 [报告]
发表于 2011-04-08 17:47 |只看该作者
都是差不多的!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP