真正根据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)>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字符集