>백엔드 개발 >PHP 튜토리얼 >PHP 영어 문자열 차단 코드(단어 무결성 보장)

PHP 영어 문자열 차단 코드(단어 무결성 보장)

WBOY
WBOY원래의
2016-07-25 08:53:041179검색
  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. }
复制代码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.