真正根据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将时间差转换为字符串提示
Sep 07 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
一个PHP的远程图片抓取函数分享
Sep 25 PHP
PHP遍历并打印指定目录下所有文件实例
Feb 10 PHP
php实现的zip文件内容比较类
Sep 24 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
php函数连续调用实例分析
Jul 30 PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
自制PHP框架之设计模式
May 07 PHP
Laravel学习教程之本地化模块
Aug 18 PHP
PHP APP微信提现接口代码
Sep 30 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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
php使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
tab栏切换原理
2017/03/22 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
微信小程序实现多张图片上传功能
2020/11/18 Javascript
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
python和go语言的区别是什么
2020/07/20 Python
python如何爬取网页中的文字
2020/07/28 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
房地产财务管理制度
2014/02/02 职场文书
大学生毕业求职自荐书范文
2014/02/04 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
投资协议书范本
2014/04/21 职场文书
学校安全生产承诺书
2014/05/23 职场文书
5s标语大全
2014/06/23 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
创业计划书之美甲店
2019/09/20 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle