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 相关文章推荐
多重?l件?合查?(二)
Oct 09 PHP
一个用php实现的获取URL信息的类
Jan 02 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
Apr 20 PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 PHP
php网页病毒清除类
Dec 08 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
PHP输出日历表代码实例
Mar 27 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
Mar 18 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
php正则表达式使用方法整理集合
Jan 31 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
Javascript模块模式分析
2008/05/16 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
Python绘制七段数码管实例代码
2017/12/20 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
服装设计专业自荐书范文
2013/12/30 职场文书
承租经营合作者协议书
2014/10/01 职场文书
小学六年级毕业感言
2015/07/30 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android