php中英文截取字符串长度,PHP截取字符串长度(中英文混合字符串)_PHP教程

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;

}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部