php英文字串截取程式碼(保證單字完整性)

WBOY
發布: 2016-07-25 08:53:04
原創
1143 人瀏覽過
  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 <= $strlen ? 6 : $strlen - $next_start;
  21. $next_segm = substr($str, $next_start, $next_len);
  22. // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节
  23. $prev_start = $start - 6 > 0 ? $start - 6 : 0;
  24. $prev_segm = substr($str, $prev_start, $start - $prev_start);
  25. } // start是负数
  26. else {
  27. // 往前再截取大约6字节
  28. $next_start = $strlen $start $length; // 初始位置
  29. $next_len = $next_start 6 <= $strlen ? 6 : $strlen - $next_start;
  30. $next_segm = substr($str, $next_start, $next_len);
  31. // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节.
  32. $start = $strlen $start;
  33. $prev_start = $start - 6 > 0 ? $start - 6 : 0;
  34. $prev_segm = substr($str, $prev_start, $start - $prev_start);
  35. }
  36. // 判断前6字节是否符合utf8规则
  37. if (preg_match('@^([x80-xBF]{0,5})[xC0-xFD]?@', $next_segm, $bytes)) {
  38. if (!empty($bytes[1])) {
  39. $bytes = $bytes[1];
  40. $res .= $bytes;
  41. }
  42. }
  43. // 判断后6字节是否符合utf8规则
  44. $ord0 = ord($res[0]);
  45. if (128 <= $ord0 && 191 >= $ord0) {
  46. // 往后截取 , 并加在res的前面.
  47. if (preg_match('@[xC0-xFD][x80-xBF]{0,5}$@', $prev_segm, $bytes)) {
  48. if (!empty($bytes[0])) {
  49. $bytes = $bytes[0];
  50. $res = $bytes . $res;
  51. }
  52. }
  53. }
  54. if (strlen($res) < $strlen) {
  55. $res = $res . '...';
  56. }
  57. return $res;
  58. }
复制代码


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板