PHP英文字符串截取:保证单词完整性的usubstr函数实现

Owen
Owen
发布时间:2026-10-14 | 4人浏览过
原创

在Web开发中,直接使用PHP内置的substr函数截取中英文混合内容,往往会因字节对齐问题导致UTF-8编码错误(乱码),或者将连续的英文单词劈开。本文提供一段可复用代码,通过预检首尾字节规律来补全被截断的字符,从而保证输出内容的完整性。

核心代码实现

以下代码定义了一个静态方法usubstr。它不仅支持正向索引,也兼容负数位置参数。其核心逻辑在于先进行基础截取,随后利用正则表达式扫描紧邻截取区域的字节序列,寻找并追加缺失的有效UTF-8字符片段,最后在必要时添加省略号以示截断。

/**
   * 完整词的截取
   *
   * @param string $str        源字符串
   * @param int    $start      起始位置
   * @param int    $length     截取长度(可选)
   *
   * @return string            截取后的结果
   */
  public static function usubstr($str, $start, $length = null)
  {
 
    // 先正常截取一遍.
    $res = substr($str, $start, $length);
    $strlen = strlen($str);
 
    /* 接着判断头尾各6字节是否完整(不残缺) */
    // 如果参数start是正数
    if ($start >= 0) {
      // 往前再截取大约6字节
      $next_start = $start + $length; // 初始位置
      $next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
      $next_segm = substr($str, $next_start, $next_len);
      // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节
      $prev_start = $start - 6 > 0 ? $start - 6 : 0;
      $prev_segm = substr($str, $prev_start, $start - $prev_start);
    } // start是负数
    else {
      // 往前再截取大约6字节
      $next_start = $strlen + $start + $length; // 初始位置
      $next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
      $next_segm = substr($str, $next_start, $next_len);
 
      // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节.
      $start = $strlen + $start;
      $prev_start = $start - 6 > 0 ? $start - 6 : 0;
      $prev_segm = substr($str, $prev_start, $start - $prev_start);
    }
    // 判断前6字节是否符合utf8规则
    if (preg_match('@^([x80-xBF]{0,5})[xC0-xFD]?@', $next_segm, $bytes)) {
      if (!empty($bytes[1])) {
        $bytes = $bytes[1];
        $res .= $bytes;
      }
    }
    // 判断后6字节是否符合utf8规则
    $ord0 = ord($res[0]);
    if (128 <= $ord0 && 191 >= $ord0) {
      // 往后截取 , 并加在res的前面.
      if (preg_match('@[xC0-xFD][x80-xBF]{0,5}$@', $prev_segm, $bytes)) {
        if (!empty($bytes[0])) {
          $bytes = $bytes[0];
          $res = $bytes . $res;
        }
      }
    }
    if (strlen($res) < $strlen) {
      $res = $res . '...';
    }
    return $res;
  }

使用步骤与操作说明

第一步:整合至业务类中

为了便于调用,建议将此代码放入您的公共工具类中。由于源码使用了public static function声明,您可以直接在项目任意位置通过类的静态方式进行访问,无需实例化对象。

第二步:调用函数执行截取

在需要显示标题、摘要等受限空间内容的页面前端控制器中调用该方法。

  • 入口:页面输出模块或API响应构建层。
  • 动作:传入$str(原始内容)、$start(截取起点,默认为0即可)及$length(希望保留的最大长度)。
  • 完成状态:控制台或前端页面正常输出无乱码的文本,且若长度不足则末尾带有“...”标记。

第三步:处理异常输入

虽然此函数已具备较高的健壮性,但在使用前请确保输入的$str为标准的UTF-8编码字符串。避免将HTML标签代码直接传入该函数,这可能会导致非预期的实体符号截断;如需过滤标签,请先配合strip_tags使用。

以上就是PHP实现英文字符串完整截取代码的详细应用说明,更多关于PHP字符串操作与UTF-8处理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表