PHP截取中文字符串的问题


Posted in PHP onJuly 12, 2006

以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的问题,解决方法是根据值是否大于等于128来判断是否是双字节字符,以避免出现乱码的情况。但中英文混合、特殊符号等问题总是存在,现在写一个比较全面的,仅供参考:

程序说明:

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

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

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

4. 能正确处理GB2312中实体字符模式(?)程序代码: 

function FSubstr($title,$start,$len="",$magic=true) 
{
/**
  *  powered by Smartpig
  *  mailto:d.einstein@263.net
  */

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

//判断起始为不正确位置
if($start > 0)
{
  $cnum = 0;
  for($i=0;$i<$start;$i++)
  {
   if(ord(substr($title,$i,1)) >= 128) $cnum ++;
  }
  if($cnum%2 != 0) $start--;

  unset($cnum);
}

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

$alen   = 0;
$blen = 0;

$realnum = 0;

for($i=$start;$i{
  $ctype = 0;
  $cstep = 0;
  $cur = substr($title,$i,1);
  if($cur == "&")
  {
   if(substr($title,$i,4) == "<")
   {
    $cstep = 4;
    $length += 4;
    $i += 3;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(substr($title,$i,4) == ">")
   {
    $cstep = 4;
    $length += 4;
    $i += 3;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(substr($title,$i,5) == "&")
   {
    $cstep = 5;
    $length += 5;
    $i += 4;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(substr($title,$i,6) == '"')
   {
    $cstep = 6;
    $length += 6;
    $i += 5;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(substr($title,$i,6) == "'")
   {
    $cstep = 6;
    $length += 6;
    $i += 5;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(preg_match("/&#(\d+);/i",substr($title,$i,8),$match))
   {
    $cstep = strlen($match[0]);
    $length += strlen($match[0]);
    $i += strlen($match[0])-1;
    $realnum ++;
    if($magic)
    {
     $blen ++;
     $ctype = 1;
    }
   }
  }else{
   if(ord($cur)>=128)
   {
    $cstep = 2;
    $length += 2;
    $i += 1;
    $realnum ++;
    if($magic)
    {
     $blen ++;
     $ctype = 1;
    }
   }else{
    $cstep = 1;
    $length +=1;
    $realnum ++;
    if($magic)
    {
     $alen++;
    }
   }
  }

  if($magic)
  {
   if(($blen*2+$alen) == ($len*2)) break;
   if(($blen*2+$alen) == ($len*2+1))
   {
    if($ctype == 1)
    {
     $length -= $cstep;
     break;
    }else{
     break;
    }
   }
  }else{
   if($realnum == $len) break;
  }
}

unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep);

return substr($title,$start,$length);
} 

 

PHP 相关文章推荐
理解php Hash函数,增强密码安全
Feb 25 PHP
PHP中获取变量的变量名的一段代码的bug分析
Jul 07 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
Sep 10 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
PHP二维数组去重实例分析
Nov 18 PHP
Laravel实现autoload方法详解
May 07 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
php装饰者模式简单应用案例分析
Oct 23 PHP
Laravel框架实现抢红包功能示例
Oct 31 PHP
PHP时间相关常用函数用法示例
Jun 03 PHP
最令PHP初学者头痛的十四个问题
Jul 12 #PHP
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
Jul 09 #PHP
PHP初学者头疼问题总结
Jul 08 #PHP
php分页函数
Jul 08 #PHP
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 #PHP
php正则
Jul 07 #PHP
使用Apache的rewrite技术
Jun 22 #PHP
You might like
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
python3实现跳一跳点击跳跃
2018/01/08 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
太太口服液广告词
2014/03/20 职场文书
数据保密承诺书
2014/06/03 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
践行三严三实心得体会
2014/10/13 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android