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 相关文章推荐
ZF等常用php框架中存在的问题
Jan 10 PHP
php 无限级数据JSON格式及JS解析
Jul 17 PHP
解析php二分法查找数组是否包含某一元素
May 23 PHP
在PHP上显示JFreechart画的统计图方法
Nov 03 PHP
php权重计算方法代码分享
Jan 09 PHP
php使用codebase生成随机数
Mar 25 PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 PHP
php检测文本的编码
Jul 26 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
laravel使用Faker数据填充的实现方法
Apr 12 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
PHP实现抽奖功能实例代码
Jun 30 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 时间转换Unix时间戳代码
2010/01/22 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
2011/12/25 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
javascript 主动派发事件总结
2011/08/09 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
微信小程序实现登录遮罩效果
2018/11/01 Javascript
python fabric实现远程操作和部署示例
2014/03/25 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
爱耳日活动总结
2014/04/30 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
您对思维方式了解多少?
2019/12/09 职场文书
详解python字符串驻留技术
2021/05/21 Python
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers
Python进程间的通信之语法学习
2022/04/11 Python
python APScheduler执行定时任务介绍
2022/04/19 Python
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers
Java实现简单小画板
2022/06/10 Java/Android