Heim >Backend-Entwicklung >PHP-Tutorial >根据utf8编码规律截取字符串的函数(utf8版的sub_str)

根据utf8编码规律截取字符串的函数(utf8版的sub_str)

WBOY
WBOYOriginal
2016-07-25 09:03:341087Durchsuche
  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 $next_segm = substr( $str , $next_start , $next_len );
  16. // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节
  17. $prev_start = $start - 6 > 0 ? $start - 6 : 0;
  18. $prev_segm = substr( $str , $prev_start , $start - $prev_start );
  19. }
  20. // start是负数
  21. else{
  22. // 往前再截取大约6字节
  23. $next_start = $strlen + $start + $length; // 初始位置
  24. $next_len = $next_start + 6 $next_segm = substr( $str , $next_start , $next_len );
  25. // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节.
  26. $start = $strlen + $start;
  27. $prev_start = $start - 6 > 0 ? $start - 6 : 0;
  28. $prev_segm = substr( $str , $prev_start , $start - $prev_start );
  29. }
  30. // 判断前6字节是否符合utf8规则
  31. if ( preg_match( '@^([\x80-\xBF]{0,5})[\xC0-\xFD]?@' , $next_segm , $bytes ) ){
  32. if ( !empty( $bytes[1] ) ){
  33. $bytes = $bytes[1];
  34. $res .= $bytes;
  35. }
  36. }
  37. // 判断后6字节是否符合utf8规则
  38. $ord0 = ord( $res[0] );
  39. if ( 128 = $ord0 ){
  40. // 往后截取 , 并加在res的前面.
  41. if ( preg_match( '@[\xC0-\xFD][\x80-\xBF]{0,5}$@' , $prev_segm , $bytes ) ){
  42. if ( !empty( $bytes[0] ) ){
  43. $bytes = $bytes[0];
  44. $res = $bytes . $res;
  45. }
  46. }
  47. }
  48. return $res;
  49. }
  50. ?>
复制代码

测试---

  1. $str = 'dfjdjf测13f试65&2数据fdj(1就mfe&……就';
  2. var_dump( utf8_substr( $str , 22 , 12 ) ); echo '
    ';
  3. var_dump( utf8_substr( $str , 22 , -6 ) ); echo '
    ';
  4. var_dump( utf8_substr( $str , 9 , 12 ) ); echo '
    ';
  5. var_dump( utf8_substr( $str , 19 , 12 ) ); echo '
    ';
  6. var_dump( utf8_substr( $str , 28 , -6 ) ); echo '
    ';
  7. ?>
复制代码

显示结果:(截取无乱码) string(12) "据fdj" string(26) "据fdj(1就mfe&…" string(13) "13f试65&2数" string(12) "数据fd" string(20) "dj(1就mfe&…"



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn