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实现框架(二)
Oct 09 PHP
从C/C++迁移到PHP——判断字符类型的函数
Oct 09 PHP
实用函数10
Nov 08 PHP
Linux下PHP安装mcrypt扩展模块笔记
Sep 10 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
php无序树实现方法
Jul 28 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
Yii全局函数用法示例
Jan 22 PHP
PHP保留两位小数的几种方法
Jul 24 PHP
Laravel第三方包报class not found的解决方法
Oct 13 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 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 获取当前访问的url文件名的方法小结
2010/02/08 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
vuex入门最详细整理
2020/03/04 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
python文件操作之目录遍历实例分析
2015/05/20 Python
python中的lambda表达式用法详解
2016/06/22 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
python内置模块collections知识点总结
2019/12/19 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
2020/07/07 Python
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
文明礼貌演讲稿
2014/05/12 职场文书
班主任工作实习计划
2015/01/16 职场文书
网上祭英烈活动总结
2015/02/04 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
详解MongoDB的条件查询和排序
2021/06/23 MongoDB
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers