background image

 

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

真正根据 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