【问题标题】:split unicode string by length PHP按长度拆分 unicode 字符串 PHP
【发布时间】:2018-02-08 04:40:16
【问题描述】:

我需要将 Unicode 代码字符串拆分为 70 个字符的数组。因此结果数组中的值将包含 70 个字符长的字符串。以下是我的代码

$msg = preg_replace('/[\r\n]+/', ' ', $smsContent);
$chunks = wordwrap($msg, 70, '\n');
$chunks = explode('\n', $chunks); 
//print_r($chunks); 

但结果数组包含不同长度的值。
这是一个例子

$smsContent = "सभी मनुष्यों कोगौरव और अधिकारों के मामले में जनजात स्वतंत्रता और समानता प्राप्त है | उन्हें बुद्धि और अन्तरात्मा कि देन प्राप्त है |";

结果:

Array
(
    [0] => सभी मनुष्यों कोगौरव और अधि
    [1] => कारों के मामले में जनजात स�
    [2] => �वतंत्रता और समानता प्राप्
    [3] => त है | उन्हें बुद्धि और अन्त
    [4] => रात्मा कि देन प्राप्त है |

)

我需要将其拆分为 70 个字符长的值,但这似乎不正确。而且我还需要防止单词分裂。

【问题讨论】:

  • wordwrap() 不能在多字节字符串上正常工作。你读过 PHP 手册页上的用户 cmets 吗?

标签: php arrays string unicode preg-replace


【解决方案1】:

您不能使用基于字节数的方法,因为您的字符串包含多字节字符并最终组合字符。你必须按字形工作。使用字符类[:graph:][:print:] 可以做到这一点:

preg_match_all('~[[:graph:]][[:print:]]{0,30}(?!\S)~u', $smsContent, $m);
print_r($m[0]);

demo

你也可以试试the grapheme functions from intl

【讨论】:

    【解决方案2】:

    你必须使用str_split()函数:

    $smsContent = "सभी मनुष्यों कोगौरव और अधिकारों के मामले में जनजात स्वतंत्रता और समानता प्राप्त है | उन्हें बुद्धि और अन्तरात्मा कि देन प्राप्त है |";
    $output = str_split($smsContent, 70);
    print_r($output);
    

    【讨论】:

    • 我得到了你在我的解决方案中提到的输出。请显示您的代码,以便我检查。
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多