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 相关文章推荐
PHP4实际应用经验篇(9)
Oct 09 PHP
关于crontab的使用详解
Jun 24 PHP
php的一个简单加密解密代码
Jan 14 PHP
php更新修改excel中的内容实例代码
Feb 26 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
Aug 11 PHP
PHP addAttribute()函数讲解
Feb 03 PHP
PHP保留两位小数的几种方法
Jul 24 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
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
javascript比较文档位置
2008/04/08 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
python和C语言混合编程实例
2014/06/04 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
django API 中接口的互相调用实例
2020/04/01 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
化工专业大学生职业生涯规划书
2014/01/14 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
MySQL索引失效的典型案例
2021/06/05 MySQL