用PHP对一段文字按长度分割,并且保持句子的完整性。

有这样的需求,有一段很长的文字,要按指定的长度来分割,但是如果直接用str_split分割,一会出现中文乱码问题,二是会把一个完整的句子截断。所以我这里写了一个函数专门解决这个问题。

<?php
/**
 * 对一段文字进行长度分割,同时按指定的分割优先顺序来分割
 *
 * @param string $str 字符
 * @param int $maxlen 每段的最大长度
 * @param array $markArr 标点符号优先级别
 * @date 2023-2-14
 */
function split_str($str, $maxlen, $markArr = array("。", "!", ".", "!", "\r\n", "\n", ",", ";", ",", ";")){
    $maxlen = intval($maxlen);

    //句子总长度
    $len = mb_strlen($str, "UTF-8");
    //句子长度小于$maxlen,不分割了
    if ($len < $maxlen) return array($str);

    $str2 = mb_substr($str, 0, $maxlen, 'UTF-8');
    $str_left = "";
    $retArr = array();

    //按分割符来分割
    foreach ($markArr as $val) {
        $pos = mb_strrpos($str2, $val, 'UTF-8');
        if ($pos === false) continue;

        $str3 = mb_substr($str2, 0, $pos + mb_strlen($val, 'UTF-8'), 'UTF-8');
        
        $retArr[] = $str3;
        $str_left = mb_substr($str2, $pos + mb_strlen($val, 'UTF-8'), mb_strlen($str2) - $pos, 'UTF-8') . mb_substr($str, $maxlen, $len - $maxlen, 'UTF-8');
        $retArr2 = split_str($str_left, $maxlen);
        $retArr = array_merge($retArr, $retArr2);
        break;
    }
    //如果没有,那说明这段话里完成没有符合的分段符。
    if (!$retArr) {
        $retArr[] = $str2;
        $str_left = mb_substr($str, $maxlen, $len - $maxlen, 'UTF-8');
        $retArr2 = split_str($str_left, $maxlen);
        $retArr = array_merge($retArr, $retArr2);
    }

    return $retArr;
}


/**
 * 按中文字来分割字符
 */
function str_split_unicode($str, $l = 0) {
    if ($l > 0) {
        $ret = array();
        $len = mb_strlen($str, "UTF-8");
        for ($i = 0; $i < $len; $i += $l) {
            $ret[] = mb_substr($str, $i, $l, "UTF-8");
        }
        return $ret;
    }
    return array($str);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值