真正根据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 相关文章推荐
mayfish 数据入库验证代码
Apr 30 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
PHP内核探索:变量存储与类型使用说明
Jan 30 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
php小技巧之过滤ascii控制字符
May 14 PHP
php计算年龄精准到年月日
Nov 17 PHP
php生成4位数字验证码的实现代码
Nov 23 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
php创建桌面快捷方式实现方法
Dec 31 PHP
PHP在线书签系统分享
Jan 04 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 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
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
Yii2框架dropDownList下拉菜单用法实例分析
2016/07/18 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
摘自启点的main.js
2008/04/20 Javascript
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
vue实现循环切换动画
2018/10/17 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
Python中的Numeric包和Numarray包使用教程
2015/04/13 Python
Python批量转换文件编码格式
2015/05/17 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
全国爱牙日活动总结
2015/02/05 职场文书
青春雷锋观后感
2015/06/10 职场文书
领导欢送会主持词
2015/07/06 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
浅析Python中的随机采样和概率分布
2021/12/06 Python