如何使用多个分隔符拆分字符串并保留分隔符?

3

我正在尝试使用多个分隔符 (↑↑ , ↑ , ↓↓ , ↓) 来拆分字符串。

例如,我有以下输入字符串:

$string = "(2.8 , 3.1) → (↓↓2.4 , ↓3.0)";

我希望将其转换成以下格式的数组(预期输出):
Array
(
    [0] => (2.8 , 3.1) → (
    [1] => ↓↓
    [2] => 2.4 , 
    [3] => ↓
    [4] => 3.0)
)

我最好的尝试输出了这个结果:

Array
(
    [0] => (2.8 , 3.1) → (
    [1] => ↓
    [2] =>2.4 , 
    [3] =>3.0)
)

这是我的当前代码:

<?php

    function multiexplode ($delimiters,$string) {
        return explode(
            $delimiters[0],
            strtr(
                $string,
                array_combine(
                    array_slice($delimiters,1),
                    array_fill(0,count($delimiters)-1,array_shift($delimiters))
                )
            )
        );
    }

    $delimiters = array('↑↑','↑','↓↓','↓');
    $test = array('2up↑↑','1up↑','2down↓↓','1down↓');
    $newDel = array('2up','1up','2down','1down');
    $array = array();

    $strings = array(
        "(2.8 , 3.1) → (↓↓2.4 , ↓3.0)",
        "(2.7 , 2.6) → (↑2.8 , ↑↑3.0)",
        "(2.0 , 3.4) → (↑↑2.8 , ↓↓2.3)"
    );

    foreach($strings as $string){
        foreach($test as $key => $reps){
            $string = str_replace(              
                $delimiters[$key],
                $reps,
                $string
            );
        }
        //echo $string;
        $array[] = array_values(array_filter(multiexplode($newDel,$string)));
    }

?>

我正在按照这种格式构建,因为我将循环那些值并在幻灯片中打印出来,而这些分隔符(箭头)具有不同的颜色。
1个回答

8
这应该适用于您:
只需使用preg_split()函数并设置标志以保留分隔符。例如:
<?php

    $string = "(2.8 , 3.1) → (↓↓2.4 , ↓3.0)";
    $arr =  preg_split("/(↑↑|↑|↓↓|↓)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE);
    print_r($arr);

?>

输出:

Array
(
    [0] => (2.8 , 3.1) → (
    [1] => ↓↓
    [2] => 2.4 , 
    [3] => ↓
    [4] => 3.0)
)

哇,我没想到这个代码只需要三行就能完成。谢谢! - roullie
有没有不用 preg 函数的解决方案?如果可能的话,我总是尽量避免使用它们。 - user5147563
@Soaku 不完全正确。explode() 函数不会保留分隔符,所以你可能需要使用 preg_split() 函数。而且我不明白为什么你要避免使用它。 - Rizier123
https://3v4l.org/E8vmH - mickmackusa

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