根据长度拆分MB字符串

问题描述 投票:3回答:1

我有一个特殊语言字符串。

先秦兩漢先秦兩漢先秦兩漢漢先秦兩漢漢先秦兩漢( 243071)

我的要求是使用php将字符数限制超出我的要求。就像它超过15个字符一样。

为此,我试过了

if(mb_strlen($string) > 15){

    $seed = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
}

但它正在打破。它并没有打破所有的情况,但一个有35个字符。

我尝试过的另一种方法是使用此功能: -

function word_chunk($str, $len = 76, $end = "||") {
                        $pattern = '~.{1,' . $len . '}~u'; // like "~.{1,76}~u"
                        $str = preg_replace($pattern, '$0' . $end, $str);
                        return rtrim($str, $end);
            }

请帮助并理解我只需要MB字符的帮助

php regex string function
1个回答
2
投票

这将在每10个“扩展字形集群”之后拆分字符串(由Wiktor在评论中提出)。

var_export(preg_split('~\X{10}\K~u', $string));

preg_split('~.{10}\K~u', $string)将处理您的示例字符串,但对于超出您的范例的情况,\X在处理unicode时更加强大。

来自https://www.regular-expressions.info/unicode.html

您可以考虑\ X点的Unicode版本。但有一个区别:\ X始终匹配换行符,而点与换行符不匹配,除非您启用点匹配换行符匹配模式。

这是a related SO page

\K重新启动全字符串匹配,因此分割中没有丢失字符。

这是$len=10 https://regex101.com/r/uO6ur9/2的演示

代码:(Demo

$string='先秦兩漢先秦兩漢先秦兩漢漢先秦兩漢漢先秦兩漢( 243071)';
var_export(preg_split('~\X{10}\K~u',$string,));

输出:

array (
  0 => '先秦兩漢先秦兩漢先秦',
  1 => '兩漢漢先秦兩漢漢先秦',
  2 => '兩漢( 243071',
  3 => ')',
)

执行:

function word_chunk($str,$len){
    return preg_split('~\X{'.$len.'}\K~u',$str);
}

虽然preg_split()可能比preg_match_all()略慢,但一个优点是preg_split()提供了所需的一维阵列。 preg_match_all()生成一个多维数组,您只需要访问[0]子数组的元素。

© www.soinside.com 2019 - 2024. All rights reserved.