欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php英文字符串截取代码(保证单词完整性)

程序员文章站 2022-04-24 14:39:45
...
  1. /**
  2. * 完整词的截取
  3. * bbs.it-home.org 编辑整理
  4. * @param $str
  5. * @param $start
  6. * @param $length
  7. *
  8. * @return string
  9. */
  10. public static function usubstr($str, $start, $length = null)
  11. {
  12. // 先正常截取一遍.
  13. $res = substr($str, $start, $length);
  14. $strlen = strlen($str);
  15. /* 接着判断头尾各6字节是否完整(不残缺) */
  16. // 如果参数start是正数
  17. if ($start >= 0) {
  18. // 往前再截取大约6字节
  19. $next_start = $start + $length; // 初始位置
  20. $next_len = $next_start + 6 $next_segm = substr($str, $next_start, $next_len);
  21. // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节
  22. $prev_start = $start - 6 > 0 ? $start - 6 : 0;
  23. $prev_segm = substr($str, $prev_start, $start - $prev_start);
  24. } // start是负数
  25. else {
  26. // 往前再截取大约6字节
  27. $next_start = $strlen + $start + $length; // 初始位置
  28. $next_len = $next_start + 6 $next_segm = substr($str, $next_start, $next_len);
  29. // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节.
  30. $start = $strlen + $start;
  31. $prev_start = $start - 6 > 0 ? $start - 6 : 0;
  32. $prev_segm = substr($str, $prev_start, $start - $prev_start);
  33. }
  34. // 判断前6字节是否符合utf8规则
  35. if (preg_match('@^([x80-xBF]{0,5})[xC0-xFD]?@', $next_segm, $bytes)) {
  36. if (!empty($bytes[1])) {
  37. $bytes = $bytes[1];
  38. $res .= $bytes;
  39. }
  40. }
  41. // 判断后6字节是否符合utf8规则
  42. $ord0 = ord($res[0]);
  43. if (128 = $ord0) {
  44. // 往后截取 , 并加在res的前面.
  45. if (preg_match('@[xC0-xFD][x80-xBF]{0,5}$@', $prev_segm, $bytes)) {
  46. if (!empty($bytes[0])) {
  47. $bytes = $bytes[0];
  48. $res = $bytes . $res;
  49. }
  50. }
  51. }
  52. if (strlen($res) $res = $res . '...';
  53. }
  54. return $res;
  55. }
复制代码