自己写的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动态生成VRML网页
Oct 09 PHP
php MsSql server时遇到的中文编码问题
Jun 11 PHP
php下使用iconv需要注意的问题
Nov 20 PHP
PHP如何抛出异常处理错误
Mar 02 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 PHP
PhpDocumentor 2安装以及生成API文档的方法
May 21 PHP
ThinkPHP的URL重写问题
Jun 22 PHP
discuz目录文件资料汇总
Dec 30 PHP
为你总结一些php信息函数
Oct 21 PHP
Redis使用Eval多个键值自增的操作实例
Nov 04 PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 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_slice 取出数组中的一段序列实例
2016/11/04 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
jquery.validate使用详解
2016/06/02 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
python读取LMDB中图像的方法
2018/07/02 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
Python中format()格式输出全解
2019/04/12 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
Python函数基本使用原理详解
2020/03/19 Python
python实现银行账户系统
2021/02/22 Python
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
英国儿童图书网站:Scholastic
2017/03/26 全球购物
纺织工程专业推荐信
2014/09/08 职场文书
民事辩护词范文
2015/05/21 职场文书
长征观后感
2015/06/09 职场文书
生死抉择观后感
2015/06/09 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
教师个人教学反思
2016/02/23 职场文书
初一语文教学反思
2016/03/03 职场文书
创业计划书之家教托管
2019/09/25 职场文书