真正根据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学习笔记之三 数据库基本操作
Jan 17 PHP
PHP curl_setopt()函数实例代码与参数分析
Jun 02 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
PHP设计模式 注册表模式
Feb 05 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
关于Sphinx创建全文检索的索引介绍
Jun 25 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
php结合curl实现多线程抓取
Jul 09 PHP
Yii2下session跨域名共存的解决方案
Feb 04 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
详解php中curl返回false的解决办法
Mar 18 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
javascript window对象属性整理
2009/10/24 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
python datetime中strptime用法详解
2019/08/29 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
Python colormap库的安装和使用详情
2020/10/06 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
校园门卫岗位职责
2013/12/09 职场文书
表彰会主持词
2014/03/26 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
治庸问责工作总结
2015/08/11 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL