-
- /*
- * 関数: 文字化けしないこと以外は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 );
- //バイトが完了していません 文字の最初のバイト、その後約 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 );
- // 最初のバイトが完全な文字の最初のバイトでない場合は、それをインターセプトします後 約 6 バイト。
- $start = $strlen + $start;
- $prev_start = $start - 6 > $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;
- }
- ?>
コードをコピー
テスト ---
-
- $str = 'dfjdjf test 13f test 65&2 datafddj(1 on mfe&...on';
- var_dump( utf8_substr( $str , 22 , 12 ) ); echo '
';
- var_dump( utf8_substr( $str , 22 , -6 ) ); echo '
';
- var_dump( $str , 9 , 12 ) ); > ';
- var_dump( utf8_substr( $str , 19 , 12 ) ); echo '
';
- var_dump( $str , 28 , -6 ) ); ; ';
- ?>
コードをコピー
結果を表示: (文字化けなしでインターセプト)
string(12) "fdjによると"
string(26) "fdj によると (1 は mfe&..."
string(13) "13f 65&2 の数値を試してください"
string(12) "データ fd"
string(20) "dj(1justmfe&..."
|