自己写的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 相关文章推荐
PHP怎样调用MSSQL的存储过程
Oct 09 PHP
php中邮箱地址正则表达式实现与详解
Apr 24 PHP
解析:使用php mongodb扩展时 需要注意的事项
Jun 18 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
Jun 29 PHP
PHP过滤黑名单关键字的方法
Dec 01 PHP
如何使用纯PHP实现定时器任务(Timer)
Jul 31 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
iOS10推送通知开发教程
Sep 19 PHP
php策略模式简单示例分析【区别于工厂模式】
Sep 25 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 PHP
PHP7修改的函数
Mar 09 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
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
php实现文件下载代码分享
2014/08/19 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
移动端js图片查看器
2016/11/17 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现正整数分解质因数操作示例
2018/08/01 Python
Python读写文件基础知识点
2019/06/10 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
平面设计专业大学生职业规划书
2014/03/12 职场文书
原材料检验岗位职责
2014/03/15 职场文书
综治宣传月活动总结
2014/04/28 职场文书
培训督导岗位职责
2015/04/10 职场文书
2015年英语教学工作总结
2015/05/25 职场文书
golang正则之命名分组方式
2021/04/25 Golang
Golang bufio详细讲解
2022/04/21 Golang