ホームページ > バックエンド開発 > PHPチュートリアル > utf8 エンコード規則に従って文字列をインターセプトする関数 (utf8 バージョンの sub_str)

utf8 エンコード規則に従って文字列をインターセプトする関数 (utf8 バージョンの sub_str)

WBOY
リリース: 2016-07-25 09:03:34
オリジナル
1118 人が閲覧しました
  1. /*
  2. * 関数: 文字化けしないこと以外はsubstrと同じ関数です
  3. * パラメータ:
  4. * 戻り値:
  5. */
  6. function utf8_substr( $str , $start , $length =null ){
  7. // まず通常通りインターセプトします。
  8. $res = substr( $str , $start , $length );
  9. $strlen = strlen( $str );
  10. /* 次に、最初の最後の 6 バイトは完全 (不完全ではない) */
  11. // パラメーター start が正の数の場合
  12. if ( $start >= 0 ){
  13. // 約 6 バイト前方をインターセプト
  14. $next_start = $start + $ length; // 初期位置
  15. $next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
  16. $next_segm = substr( $str , $next_start , $next_len );
  17. //バイトが完了していません 文字の最初のバイト、その後約 6 バイトをインターセプトします
  18. $prev_start = $start - 6 > 0 ? $start - 6 : 0;
  19. $prev_segm = substr( $str , $prev_start , $start; - $prev_start );
  20. }
  21. // start は負の数です
  22. else{
  23. // 約 6 バイト前方をインターセプトします
  24. $next_start = $strlen + $start + $length // 初期位置
  25. $next_len = $next_start + 6 < ;= $strlen ? 6 : $strlen - $next_start;
  26. $next_segm = substr( $str , $next_start , $next_len );
  27. // 最初のバイトが完全な文字の最初のバイトでない場合は、それをインターセプトします後 約 6 バイト。
  28. $start = $strlen + $start;
  29. $prev_start = $start - 6 > $start - 6 : 0;
  30. $prev_segm = substr( $str , $prev_start , $start; prev_start );
  31. }
  32. // 最初の 6 バイトが utf8 ルールに準拠しているかどうかを判断します
  33. if ( preg_match( '@^([x80-xBF]{0,5})[xC0-xFD]?@' , $next_segm , $ bytes ) ){
  34. if ( !empty( $bytes[1] ) ){
  35. $bytes = $bytes[1];
  36. $res .= $bytes;
  37. }
  38. }
  39. // 最後の 6 バイトかどうかを判断しますutf8 ルールに一致
  40. $ord0 = ord( $res[0] );
  41. if ( 128 <= $ord0 && 191 >= $ord0 ){
  42. // 後ろからインターセプトして res の前に追加します
  43. if ( preg_match( '@[xC0-xFD][x80-xBF]{0,5}$@' , $prev_segm , $bytes ) ){
  44. if ( !empty( $bytes[0] ) ){
  45. $bytes = $ bytes[0];
  46. $res = $bytes . $res;
  47. }
  48. }
  49. }
  50. return $res;
  51. }
  52. ?>
コードをコピー

テスト ---

  1. $str = 'dfjdjf test 13f test 65&2 datafddj(1 on mfe&...on';
  2. var_dump( utf8_substr( $str , 22 , 12 ) ); echo '
    ';
  3. var_dump( utf8_substr( $str , 22 , -6 ) ); echo '
    ';
  4. var_dump( $str , 9 , 12 ) ); > ';
  5. var_dump( utf8_substr( $str , 19 , 12 ) ); echo '
    ';
  6. var_dump( $str , 28 , -6 ) ); ; ';
  7. ?>
コードをコピー

結果を表示: (文字化けなしでインターセプト) string(12) "fdjによると" string(26) "fdj によると (1 は mfe&..." string(13) "13f 65&2 の数値を試してください" string(12) "データ fd" string(20) "dj(1justmfe&..."



ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート