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调用Java对象的方法
Oct 09 PHP
提升PHP执行速度全攻略
Oct 09 PHP
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
Mar 07 PHP
使用 eAccelerator加速PHP代码的目的
Mar 16 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
Oct 22 PHP
防止用户利用PHP代码DOS造成用光网络带宽
Mar 01 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
Jun 30 PHP
PHP is_array() 检测变量是否是数组的实现方法
Jun 13 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 PHP
PHP的imageTtfText()函数深入详解
Mar 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
调整PHP的性能
2013/10/30 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
PHP chr()函数讲解
2019/02/11 PHP
javascript操作字符串的原生方法
2014/12/22 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
Puppet的一些技巧
2018/09/17 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
python实现代码统计器
2019/09/19 Python
Django 请求Request的具体使用方法
2019/11/11 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
个人借款担保书
2014/04/02 职场文书
小学教师教学随笔
2015/08/14 职场文书
基于Redission的分布式锁实战
2022/08/14 Redis