【问题标题】:How to split a string character by character, , paying attention to special characters如何按字符分割字符串,注意特殊字符
【发布时间】:2012-04-29 14:40:53
【问题描述】:

我正在尝试逐个字符地分解字符串,但我遇到了特殊字符的问题。 我目前正在使用以下功能:

<?php
$input = "Comment ça va?";
$array_input = str_split($input, 1);
print_r($array_input);
?>

这是输出:

Array (
[0] => C [1] => o [2] => m [3] => m [4] => e
[5] => n [6] => t [7] => [8] => � [9] => �
[10] => a [11] => [12] => v [13] => a [14] => ? )

我对换行有同样的问题:

输入:
“喂!
哎?”

输出:

Array ( [0] => H [1] => � [2] => � [3] => ! [4] => 
[5] => [6] => O [7] => u [8] => i [9] => ? )

有人有这个问题的解决方案吗? 非常感谢。

【问题讨论】:

    标签: php string split


    【解决方案1】:

    str_split 的 Unicode 字符串有问题。

    您可以在preg_split 中使用u 修饰符

    例如:

    $input = "Comment ça va?";
    $letters1 = str_split($input);
    $letters2 = preg_split('//u', $input, -1, PREG_SPLIT_NO_EMPTY);
    
    print_r($letters1);
    print_r($letters2);
    

    会输出

    Array ( [0] => C [1] => o [2] => m [3] => m [4] => e 
            [5] => n [6] => t [7] => [8] => � [9] => � 
            [10] => a [11] => [12] => v [13] => a [14] => ? ) 
    
    Array ( [0] => C [1] => o [2] => m [3] => m [4] => e 
            [5] => n [6] => t [7] => [8] => ç [9] => a 
            [10] => [11] => v [12] => a [13] => ? ) 
    

    【讨论】:

    • 感谢您的回答。它适用于特殊字符,但不适用于换行符: INPUT: hé!哎?输出:数组 ( [0] => h [1] => é [2] => ! [3] => [4] => [5] => o [6] => u [7] => i [8] => ?)
    • @Zorkzyd:它实际上正在工作:位置 3 和 4 分别是 \r 和 \n...(尝试 ord($letters[3])ord($letters[4]),你会分别得到 13 和 10,它们是\r\n 的 ASCII 码)。
    • 感谢您的解释。是否可以“合并”输出数组中的 \r\n ?
    • @Zorkzyd:您可以在调用preg_split 之前将它们从字符串中删除。例如:$input = preg_replace('/\\r\\n/', '', $input);
    • 我应该知道的 :) 非常感谢您的帮助!
    【解决方案2】:

    这是因为 PHP 的 str_split 函数不是多字节安全的,即它不能正确处理 Unicode。你可以改用这个函数,它是str_split的多字节安全实现

    function mb_str_split( $string ) { 
        # Split at all position not after the start: ^ 
        # and not before the end: $ 
        return preg_split('/(?<!^)(?!$)/u', $string ); 
    } 
    

    (来源:PHP documentation中的用户cmets)

    【讨论】:

    • 谢谢大安,但尼科的回答似乎更容易:)
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 2014-10-05
    • 2019-03-19
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多