欢迎 chinavb 加入本站!
 免费注册  用户登陆  汇款方式  汇款确认  产品报价  联系我们  帮助中心
加入收藏
设为首页
会员体系
申请VIP
网站首页 光盘超市 软件下载 技术文章 专题 用户中心 VIP会员 技术论坛 网站留言 娱乐中心 卓越资源
今天是:2009年01月08日 星期四  您现在位于: 首页 → 技术文章 → PHP 截取中文字符串
   PHP 截取中文字符串
作者:  出处:Unix爱好者家园unix-cd.com  更新时间: 2006年02月17日 
 

  以下代码试用于 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<strlen($title);$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);
  }

 (本文已被浏览 1488 次)
 发布人:sdccf
 → 推荐给我的好友
上篇文章:Linux引导加载程序之争:了解LILO和GRUB
下篇文章:Linux从办公自动化做起
 相关文章:
PHPMyadmin配置文件详解 实现基于php和MySQL的动态树型菜单
用C语言操作MySQL数据库 使用GeoIP和PHP构建一个简单的MySQL地理数据库
PHP 和 MySQL 开发的 8 个技巧 PHP 会话 (Session) 使用入门
用php调用ping命令 用php压缩解压缩文件
MySQL常用命令八(密码的修改方法) Ubuntu 6.10 Linux php+mysql web配置
Linux下配置功能完善的Web服务器 PHP连接Oracle
ubuntu 6.10 php+mysql web配置 Apache+PHP5.0+GD+Zend+Mysql的配置
redhat 9下配置APACHE2+PHP5+MYSQL5+GD库 在C#程序中使用MYSQL数据库
巧用tmpfs加速你的linux服务器 Linux下MySQL+Apache+php安装方法
PHP也可以当成Shell Script使用 PHP中发送邮件的几种方法总结

相关搜索
查看百度中关于PHP 截取中文字符串的更多内容
查看google中关于PHP 截取中文字符串的更多内容
   文章分类
操作系统 |
SCO_UNIX  Sun_Solaris  IBM_AIX  HP_UX  Linux  BSD  Tru64_UNIX 
通用UNIX知识  Windows  Minix 
程序设计 |
Shell编程  C/C++  汇编  PHP  JAVA  Perl  Python 
ASP/HTML  XML  中间件 
数据库 |
Oracle  Informix  Sybase  Fox  DB2  SQL  MySQL 
PostgreSQL 
网络应用 |
网络应用 
计算机硬件 |
计算机主机  打印机  路由器  交换机  终端  磁带机  MO 
刻录机  终端服务器  调制解调器 
   文章评论
  → 评论内容 (点击查看)   共0条评论,每页显示5条评论   浏览所有评论
(没有相关评论)
  → 发表我的评论
您的姓名: 您的Email:
评论内容:
250字内
发表评论:      发表评论须知 →
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  • 关于我们 ┋  网站留言 ┋  网站地图 ┋  友情链接 ┋  与我在线 ┋  汇款确认 ┋  管理 ┋  TOP
    Unix爱好者家园  http://www.unix-cd.com/
    联系我们:sdccf@163.com
    腾讯QQ: 7644599
    备案序号:鲁ICP备05000455号
    Copyright (c) 2001-2008 Unix-cd.com. All Rights Reserved.