根据长度拆分MB字符串

时间:2017-12-20 09:56:03

标签: php regex string function

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

先秦兩漢先秦兩漢先秦兩漢漢先秦兩漢漢先秦兩漢( 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字符的帮助

1 个答案:

答案 0 :(得分: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()提供了所需的1维数组。 preg_match_all()生成一个多维数组,您只需要访问[0]子数组的元素。