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 相关文章推荐
简单的页面缓冲技术
Oct 09 PHP
ZF等常用php框架中存在的问题
Jan 10 PHP
php学习笔记 数组的常用函数
Jun 13 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
thinkphp实现图片上传功能分享
Mar 04 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
Aug 16 PHP
Symfony2实现在doctrine中内置数据的方法
Feb 05 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 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
再说下636单管机
2021/03/02 无线电
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
django中的ajax组件教程详解
2018/10/18 PHP
php7 新增功能实例总结
2020/05/25 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Django开发的简易留言板案例详解
2018/12/04 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
简述python Scrapy框架
2020/08/17 Python
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
Linux如何为某个操作添加别名
2013/03/01 面试题
国际贸易专业推荐信
2013/11/15 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
《宋庆龄故居的樟树》教学反思
2014/04/07 职场文书
狮子林导游词
2015/02/03 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
教师节大会主持词
2015/07/06 职场文书
初中物理教学反思
2016/02/19 职场文书