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配置文件中最常用四个ini函数
Mar 19 PHP
模板引擎正则表达式调试小技巧
Jul 20 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
解析strtr函数的效率问题
Jun 26 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
Jan 03 PHP
php实现可运算的验证码
Nov 10 PHP
Yii2.0 模态弹出框+ajax提交表单
May 22 PHP
PHP实现的XML操作类【XML Library】
Dec 29 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP的重载使用魔术方法代码实例详解
Feb 26 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
js 操作select和option常用代码整理
2012/12/13 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
原生js实现自定义消息提示框
2020/11/19 Javascript
python开发之for循环操作实例详解
2015/11/12 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
Django choices下拉列表绑定实例
2020/03/13 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
美国第一香水网站:Perfume.com
2017/01/23 全球购物
升职自荐书范文
2013/11/28 职场文书
幼儿园保育员辞职信
2014/01/12 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
司机岗位职责说明书
2014/07/29 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
2014年安全员工作总结
2014/11/13 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
python井字棋游戏实现人机对战
2022/04/28 Python