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

2015-01-24信息快讯网

真正根据utf8编码的规律来进行截取的字符的函数,utf8版sub_str 支持1~6个字节的字符的截取,而非只针对中文,比网上的全

 
/* 
* 功能: 作用跟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获取$_POST同名参数数组的实现介绍
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
解析curl提交GET,POST,Cookie的简单方法
浅析php变量修饰符static的使用
使用PHP接收POST数据,解析json数据
php 去除html标记--strip_tags与htmlspecialchars的区别详解
解析strtr函数的效率问题
比较strtr, str_replace和preg_replace三个函数的效率
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
php常用Stream函数集介绍
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
解析使用substr截取UTF-8中文字符串出现乱码的问题
『PHP』PHP截断函数mb_substr()使用介绍
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
php验证手机号码(支持归属地查询及编码为UTF8)
Zend Studio去除编辑器的语法警告设置方法
php中检查文件或目录是否存在的代码小结
PHP 中关于ord($str)&gt;0x80的详细说明
php中判断文件存在是用file_exists还是is_file的整理
PHP中file_exists与is_file,is_dir的区别介绍
PHP UTF8中文字符截断函数代码
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
PHP反转字符串函数strrev()函数的用法
PHP中strtotime函数使用方法分享
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
PHP通过iconv将字符串从GBK转换为UTF8字符集
©2014-2024 dbsqp.com