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 相关文章推荐
如何将数据从文本导入到mysql
Oct 09 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
php批量上传的实现代码
Jun 09 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
PHP中if和or运行效率对比
Dec 12 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
Jun 05 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 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
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
js单例模式详解实例
2013/11/21 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
python中反射用法实例
2015/03/27 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
2019/09/20 Python
Tensorflow 多线程设置方式
2020/02/06 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
python logging模块的使用详解
2020/10/23 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
2014年高三毕业生自我评价
2014/01/11 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
2015年校医个人工作总结
2015/07/24 职场文书
pytorch中的model=model.to(device)使用说明
2021/05/24 Python
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers
配置Kubernetes外网访问集群
2022/03/31 Servers
CentOS MySql8 远程连接实战
2022/04/19 MySQL