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
;
}
}