真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )


Posted in PHP onOctober 24, 2012
/* 
* 功能: 作用跟substr一样,除了它不会造成乱码 
* 参数: 
* 返回: 
*/ 
function utf8_substr( $str , $start , $length=null ){ 
// 先正常截取一遍. 
$res = substr( $str , $start , $length ); 
$strlen = strlen( $str ); 
/* 接着判断头尾各6字节是否完整(不残缺) */ 
// 如果参数start是正数 
if ( $start >= 0 ){ 
// 往前再截取大约6字节 
$next_start = $start + $length; // 初始位置 
$next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start; 
$next_segm = substr( $str , $next_start , $next_len ); 
// 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节 
$prev_start = $start - 6 > 0 ? $start - 6 : 0; 
$prev_segm = substr( $str , $prev_start , $start - $prev_start ); 
} 
// start是负数 
else{ 
// 往前再截取大约6字节 
$next_start = $strlen + $start + $length; // 初始位置 
$next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start; 
$next_segm = substr( $str , $next_start , $next_len ); 
// 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节. 
$start = $strlen + $start; 
$prev_start = $start - 6 > 0 ? $start - 6 : 0; 
$prev_segm = substr( $str , $prev_start , $start - $prev_start ); 
} 
// 判断前6字节是否符合utf8规则 
if ( preg_match( '@^([\x80-\xBF]{0,5})[\xC0-\xFD]?@' , $next_segm , $bytes ) ){ 
if ( !empty( $bytes[1] ) ){ 
$bytes = $bytes[1]; 
$res .= $bytes; 
} 
} 
// 判断后6字节是否符合utf8规则 
$ord0 = ord( $res[0] ); 
if ( 128 <= $ord0 && 191 >= $ord0 ){ 
// 往后截取 , 并加在res的前面. 
if ( preg_match( '@[\xC0-\xFD][\x80-\xBF]{0,5}$@' , $prev_segm , $bytes ) ){ 
if ( !empty( $bytes[0] ) ){ 
$bytes = $bytes[0]; 
$res = $bytes . $res; 
} 
} 
} 
return $res; 
}

测试数据::
<?php 
$str = 'dfjdjf测13f试65&2数据fdj(1就mfe&……就'; 
var_dump( utf8_substr( $str , 22 , 12 ) ); echo ' <br /> '; 
var_dump( utf8_substr( $str , 22 , -6 ) ); echo ' <br /> '; 
var_dump( utf8_substr( $str , 9 , 12 ) ); echo ' <br /> '; 
var_dump( utf8_substr( $str , 19 , 12 ) ); echo ' <br /> '; 
var_dump( utf8_substr( $str , 28 , -6 ) ); echo ' <br /> ';

显示结果::(截取无乱码, 欢迎大家测试, 提交bug)
string(12) "据fdj"
string(26) "据fdj(1就mfe&…"
string(13) "13f试65&2数"
string(12) "数据fd"
string(20) "dj(1就mfe&…"
PHP 相关文章推荐
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
PHP实现文件上传下载实例
Oct 18 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
Apr 08 PHP
laravel实现按时间日期进行分组统计方法示例
Mar 23 PHP
php 利用socket发送GET,POST请求的实例代码
Jul 04 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 PHP
php中检查文件或目录是否存在的代码小结
Oct 22 #PHP
php模拟js函数unescape的函数代码
Oct 20 #PHP
PHP 万年历实现代码
Oct 18 #PHP
php页面缓存ob系列函数介绍
Oct 18 #PHP
php cc攻击代码与防范方法
Oct 18 #PHP
php shell超强免杀、减少体积工具实现代码
Oct 16 #PHP
PHP中替换换行符的几种方法小结
Oct 15 #PHP
You might like
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
python读取LMDB中图像的方法
2018/07/02 Python
mac下如何将python2.7改为python3
2018/07/13 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
医师定期考核实施方案
2014/05/07 职场文书
地心历险记观后感
2015/06/15 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
使用vue判断当前环境是安卓还是IOS
2022/04/12 Vue.js
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android