源码论坛公告:本站是一个交流学习建站资源的社区论坛,旨在交流学习源码脚本等资源技术,欢迎大家投稿发言! 【点击此处将锦尚放在桌面

源码论坛,商业源码下载,尽在锦尚中国商业源码论坛

 找回密码
 会员注册

QQ登录

只需一步,快速开始

查看: 8370|回复: 0

[PHP编程] PHP截取中文字符串的问题解决办法

[复制链接]

1169

主题

1557

帖子

8820

金币

超级版主

Rank: 8Rank: 8

积分
19326
发表于 2019-2-13 01:03:51 | 显示全部楼层 |阅读模式
以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的问题,解决方法是根据值是否大于等于128来判断是否是双字节字符,以避免出现乱码的情况。但中英文混合、特殊符号等问题总是存在,现在写一个比较全面的,仅供参考:

程序说明:

1. len 参数以中文字符为标准,1len等于2个英文字符,为了形式上好看些

2. 如果将magic参数设为false,则中文和英文同等看待,取绝对的字符数

3. 特别适用于用htmlspecialchars()进行过编码的字符串

4. 能正确处理GB2312中实体字符模式(𖰰)

程序代码:  
  1. function FSubstr($title,$start,$len="",$magic=true)  
  2. {
  3. /**
  4.   *  powered by Smartpig
  5.   *  mailto:d.einstein@263.net
  6.   */

  7. $length = 0;
  8. if($len == "") $len = strlen($title);

  9. //判断起始为不正确位置
  10. if($start > 0)
  11. {
  12.   $cnum = 0;
  13.   for($i=0;$i<$start;$i++)
  14.   {
  15.    if(ord(substr($title,$i,1)) >= 128) $cnum ++;
  16.   }
  17.   if($cnum%2 != 0) $start--;

  18.   unset($cnum);
  19. }

  20. if(strlen($title)<=$len) return substr($title,$start,$len);

  21. $alen   = 0;
  22. $blen = 0;

  23. $realnum = 0;

  24. for($i=$start;$i<strlen($title);$i++)
  25. {
  26.   $ctype = 0;
  27.   $cstep = 0;
  28.   $cur = substr($title,$i,1);
  29.   if($cur == "&")
  30.   {
  31.    if(substr($title,$i,4) == "<")
  32.    {
  33.     $cstep = 4;
  34.     $length += 4;
  35.     $i += 3;
  36.     $realnum ++;
  37.     if($magic)
  38.     {
  39.      $alen ++;
  40.     }
  41.    }
  42.    else if(substr($title,$i,4) == ">")
  43.    {
  44.     $cstep = 4;
  45.     $length += 4;
  46.     $i += 3;
  47.     $realnum ++;
  48.     if($magic)
  49.     {
  50.      $alen ++;
  51.     }
  52.    }
  53.    else if(substr($title,$i,5) == "&")
  54.    {
  55.     $cstep = 5;
  56.     $length += 5;
  57.     $i += 4;
  58.     $realnum ++;
  59.     if($magic)
  60.     {
  61.      $alen ++;
  62.     }
  63.    }
  64.    else if(substr($title,$i,6) == """)
  65.    {
  66.     $cstep = 6;
  67.     $length += 6;
  68.     $i += 5;
  69.     $realnum ++;
  70.     if($magic)
  71.     {
  72.      $alen ++;
  73.     }
  74.    }
  75.    else if(substr($title,$i,6) == "'")
  76.    {
  77.     $cstep = 6;
  78.     $length += 6;
  79.     $i += 5;
  80.     $realnum ++;
  81.     if($magic)
  82.     {
  83.      $alen ++;
  84.     }
  85.    }
  86.    else if(preg_match("/&#(\d+);/i",substr($title,$i,8),$match))
  87.    {
  88.     $cstep = strlen($match[0]);
  89.     $length += strlen($match[0]);
  90.     $i += strlen($match[0])-1;
  91.     $realnum ++;
  92.     if($magic)
  93.     {
  94.      $blen ++;
  95.      $ctype = 1;
  96.     }
  97.    }
  98.   }else{
  99.    if(ord($cur)>=128)
  100.    {
  101.     $cstep = 2;
  102.     $length += 2;
  103.     $i += 1;
  104.     $realnum ++;
  105.     if($magic)
  106.     {
  107.      $blen ++;
  108.      $ctype = 1;
  109.     }
  110.    }else{
  111.     $cstep = 1;
  112.     $length +=1;
  113.     $realnum ++;
  114.     if($magic)
  115.     {
  116.      $alen++;
  117.     }
  118.    }
  119.   }

  120.   if($magic)
  121.   {
  122.    if(($blen*2+$alen) == ($len*2)) break;
  123.    if(($blen*2+$alen) == ($len*2+1))
  124.    {
  125.     if($ctype == 1)
  126.     {
  127.      $length -= $cstep;
  128.      break;
  129.     }else{
  130.      break;
  131.     }
  132.    }
  133.   }else{
  134.    if($realnum == $len) break;
  135.   }
  136. }

  137. unset($cur);
  138. unset($alen);
  139. unset($blen);
  140. unset($realnum);
  141. unset($ctype);
  142. unset($cstep);

  143. return substr($title,$start,$length);
  144. }
复制代码
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

锦尚中国源码论坛

聚合标签|锦尚中国,为中国网站设计添动力 ( 鲁ICP备09033200号 ) |网站地图

GMT+8, 2024-4-18 11:05 , Processed in 0.027673 second(s), 16 queries .

带宽由 锦尚数据 提供 专业的数据中心

© 锦尚中国源码论坛 52jscn Inc. 非法入侵必将受到法律制裁 法律顾问:IT法律网 & 褚福省律师 锦尚爱心 版权申诉 版权与免责声明