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
文件上传类
Oct 09 PHP
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
CodeIgniter模板引擎使用实例
Jul 15 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
Jul 25 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
Oct 14 PHP
给WordPress中的留言加上楼层号的PHP代码实例
Dec 14 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
May 13 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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产生动态的影像图
2006/10/09 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
JavaScript 对象、函数和继承
2009/07/07 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
一个基于flask的web应用诞生(1)
2017/04/11 Python
Python函数中不定长参数的写法
2019/02/13 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
武汉东之林科技有限公司机试
2013/09/17 面试题
2015年库房工作总结
2015/04/30 职场文书
项目备案申请报告
2015/05/15 职场文书
水浒传读书笔记
2015/06/25 职场文书
暑假生活随笔
2015/08/15 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js