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&amp;MYSQL分页原理及实现
Jan 02 PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
基于PHP CURL用法的深入分析
Jun 09 PHP
ThinkPHP中I(),U(),$this-&gt;post()等函数用法
Nov 22 PHP
php中stdClass的用法分析
Feb 27 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
Jul 01 PHP
php对接java现实加签验签的实例
Nov 25 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
Smarty模板类内部原理实例分析
Jul 03 PHP
PHP7原生MySQL数据库操作实现代码
Jul 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
一些php技巧与注意事项分析
2011/02/03 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
javascript 对象定义方法 简单易学
2009/03/22 Javascript
从零开始学习jQuery (六) jquery中的AJAX使用
2011/02/23 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
详解vuex的简单使用
2018/03/12 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
Python sklearn KFold 生成交叉验证数据集的方法
2018/12/11 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
大三学生入党思想汇报
2014/01/02 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
学生个人评语大全
2015/01/04 职场文书
英语辞职信范文
2015/02/28 职场文书
商务宴会祝酒词
2015/08/11 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android