自己写的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 相关文章推荐
NT IIS下用ODBC连接数据库
Oct 09 PHP
php 求质素(素数) 的实现代码
Apr 12 PHP
php入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
深入PHP数据加密详解
Jun 18 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
php生成酷炫的四个字符验证码
Apr 22 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 PHP
深入研究PHP中的preg_replace和代码执行
Aug 15 PHP
PHP7 echo和print语句实例用法
Feb 15 PHP
PHP单元测试配置与使用方法详解
Dec 27 PHP
PHP 对象接口简单实现方法示例
Apr 13 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
php的curl实现get和post的代码
2008/08/23 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
PHP递归的三种常用方式
2019/02/28 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
js 异步处理进度条
2010/04/01 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
js实现表格字段排序
2014/02/19 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
Python中统计函数运行耗时的方法
2015/05/05 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python三级目录展示的实现方法
2016/09/28 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
将python图片转为二进制文本的实例
2019/01/24 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
Redbubble法国:由独立艺术家设计的独特产品
2019/01/08 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
2014年人事专员工作总结
2014/11/19 职场文书
地道战观后感300字
2015/06/04 职场文书