PHP英文字符串截取:保证单词完整性的usubstr函数实现
在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处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









