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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
常用的php对象类型判断
Aug 27 PHP
php 代码优化之经典示例
Mar 24 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
Laravel框架实现的记录SQL日志功能示例
Jun 19 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 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 输出简单动态WAP页面
2009/06/09 PHP
php强制下载类型的实现代码
2011/04/21 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
2013/12/27 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
2019/08/16 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
python3.5绘制随机漫步图
2018/08/27 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
怎样声明接口
2014/09/19 面试题
2014升学宴答谢词
2014/01/26 职场文书
中学教师培训制度
2014/01/31 职场文书
工作时间上网检讨书
2014/02/03 职场文书
社团招新策划书
2014/02/04 职场文书
美容院店长岗位职责
2014/04/08 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
2014年副班长工作总结
2014/12/10 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
六年级情感作文之500字
2019/10/23 职场文书
Python必备技巧之字符数据操作详解
2022/03/23 Python