有这样的需求,有一段很长的文字,要按指定的长度来分割,但是如果直接用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);
}