真正根据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入门学习知识点三 PHP上传
Jul 14 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
PHP下判断网址是否有效的代码
Oct 08 PHP
php 不使用js实现页面跳转
Feb 11 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
PHP将HTML转换成文本的实现代码
Jan 21 PHP
php实现概率性随机抽奖代码
Jan 02 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
php写入文件不覆盖的实例讲解
Sep 17 PHP
Laravel5.1 框架表单验证操作实例详解
Jan 07 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 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新手上路(五)
2006/10/09 PHP
PHP获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
php查询操作实现投票功能
2016/05/09 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
uploadify 3.0 详细使用说明
2012/06/18 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
使用RequireJS优化JavaScript引用代码的方法
2015/07/01 Javascript
jQuery插件简单实现方法
2015/07/18 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
python 从远程服务器下载日志文件的程序
2013/02/10 Python
python多重继承新算法C3介绍
2014/09/28 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
python实现图片彩色转化为素描
2019/01/15 Python
python浪漫表白源码
2019/04/05 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
python如何写个俄罗斯方块
2020/11/06 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
大学生职业生涯规划书模板
2014/01/18 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server