自己写的php中文截取函数mb_strlen和mb_substr


Posted in PHP onFebruary 09, 2015

众所周知,php 自带的 strlen 与 substr 函数没法处理中文字符,于是,我们会用 mb_ 系列函数替代。但是,没有 mbstring 库怎么办?这就需要我们自己写一个来替代了,废话不多说,先上代码:

if ( !function_exists('mb_strlen') ) {

 function mb_strlen ($text, $encode) {

  if ($encode=='UTF-8') {

   return preg_match_all('%(?:

       [\x09\x0A\x0D\x20-\x7E]           # ASCII

     | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte

     |  \xE0[\xA0-\xBF][\x80-\xBF]       # excluding overlongs

     | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte

     |  \xED[\x80-\x9F][\x80-\xBF]       # excluding surrogates

     |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3

     | [\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15

     |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16

     )%xs',$text,$out);

  }else{

   return strlen($text);

  }

 }

}
/* from Internet, author unknown */

if (!function_exists('mb_substr')) {

    function mb_substr($str, $start, $len = '', $encoding="UTF-8"){

        $limit = strlen($str);

 

        for ($s = 0; $start > 0;--$start) {// found the real start

            if ($s >= $limit)

                break;

 

            if ($str[$s] <= "\x7F")

                ++$s;

            else {

                ++$s; // skip length

 

                while ($str[$s] >= "\x80" && $str[$s] <= "\xBF")

                    ++$s;

            }

        }

 

        if ($len == '')

            return substr($str, $s);

        else

            for ($e = $s; $len > 0; --$len) {//found the real end

                if ($e >= $limit)

                    break;

 

                if ($str[$e] <= "\x7F")

                    ++$e;

                else {

                    ++$e;//skip length

 

                    while ($str[$e] >= "\x80" && $str[$e] <= "\xBF" && $e < $limit)

                        ++$e;

                }

            }

 

        return substr($str, $s, $e - $s);

    }

}
PHP 相关文章推荐
第十节 抽象方法和抽象类 [10]
Oct 09 PHP
php adodb操作mysql数据库
Mar 19 PHP
Windows下安装Memcached的步骤说明
Apr 25 PHP
PHP 编写大型网站问题集
May 07 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
php实现设计模式中的单例模式详解
Oct 11 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
php注册审核重点解析(数据访问)
May 23 PHP
浅谈PHP中的Trait使用方法
Mar 22 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 01 PHP
php构造函数的继承方法
Feb 09 #PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 #PHP
php抽象类使用要点与注意事项分析
Feb 09 #PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 #PHP
支持png透明图片的php生成缩略图类分享
Feb 08 #PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
Feb 08 #PHP
php中get_object_vars()方法用法实例
Feb 08 #PHP
You might like
php array_map()数组函数使用说明
2011/07/12 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
5 cool javascript apps
2007/03/24 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
javascript中innerText和innerHTML属性用法实例分析
2015/05/13 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
python中的闭包用法实例详解
2015/05/05 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
Python安装pycurl失败的解决方法
2018/10/15 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
编辑个人求职信范文
2013/09/21 职场文书
工厂厂长的职责
2013/12/12 职场文书
医学专业自荐信
2014/06/14 职场文书
九年级数学教学反思
2016/02/17 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
合作协议书格式范本
2016/03/21 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang