根据长度拆分MB字符串

3

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

先秦兩漢先秦兩漢先秦兩漢漢先秦兩漢漢先秦兩漢( 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
请提供一个输入字符串(或三个),并展示期望的输出结果。 - mickmackusa
实际上,我不能翻译它,因为它是另一种语言,而且我不知道内容有多机密。而且我也无法阅读那种语言,我只是一个程序员,你知道的 :) - Gagan
你是否正在寻找一个多字节的wordwrap等效函数?类似于https://dev59.com/gm865IYBdhLWcg3wat6l#4988494这样的东西吗? - apokryfos
我已经更新了我的问题并添加了文本,但我不知道那意味着什么。 - Gagan
实际上,当我在片段检查器中检查这段代码时,它运行良好,但当我执行包含许多行的CSV时,它会崩溃并显示“此页面无法正常工作”。 - Gagan
显示剩余5条评论
1个回答

3
这将在每个第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 总是匹配换行符,而点除非启用点匹配换行模式,否则不匹配换行符。

这里有一个相关的 SO 页面

\K 重新启动了完整的字符串匹配,因此在分割时没有字符丢失。

这是一个演示,其中 $len=10https://regex101.com/r/uO6ur9/2

代码: (演示)

$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_match_all()生成一个多维数组,您只需要访问[0]子数组的元素即可。


$seed = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY); -- 有什么区别,请解释? - Gagan
这将在每个MB字符上进行分割:http://sandbox.onlinephpfunctions.com/code/4c15f2f40df93535e24f7179cd551ef9d8681228 - mickmackusa
我看到了一个正则表达式的测试网站,我能在那里测试我的实际文本吗?如果可以,我如何知道我的文本是否正常工作?请帮忙。 - Gagan
稍等一下,你很快,让我测试一下。 - Gagan
最终解决了问题,原来是因为我的懒惰。我使用 Ctrl+H 尝试将所有的 ** 替换为 ||,结果导致函数上面的注释也被改变了,因此我的 PHP 文件无法正常执行。 - Gagan
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接