如何通过多个分隔符来分解字符串并保留分隔符?

rou*_*lie 2 php regex string explode preg-split

我正在尝试使用多个分隔符(?? , ? , ?? , ?)来分解字符串.

例如,我有这个输入字符串:

$string = "(2.8 , 3.1) ? (??2.4 , ?3.0)";
Run Code Online (Sandbox Code Playgroud)

我想将它转换为这样的数组(预期输出):

Array
(
    [0] => (2.8 , 3.1) ? (
    [1] => ??
    [2] => 2.4 , 
    [3] => ?
    [4] => 3.0)
)
Run Code Online (Sandbox Code Playgroud)

我最好的尝试打印我(当前输出):

Array
(
    [0] => (2.8 , 3.1) ? (
    [1] => ?
    [2] => ?2.4 , 
    [3] => ?3.0)
)
Run Code Online (Sandbox Code Playgroud)

这是我目前的代码:

<?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)));
    }

?>
Run Code Online (Sandbox Code Playgroud)

我正在构建它,就像那种格式,因为我将循环这些值并在powerpoint内部打印那些并且那些分隔符(箭头)具有不同的颜色

Riz*_*123 6

这应该适合你:

只需使用preg_split()并设置标志以保留分隔符.例如

<?php

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

?>
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => (2.8 , 3.1) ? (
    [1] => ??
    [2] => 2.4 , 
    [3] => ?
    [4] => 3.0)
)
Run Code Online (Sandbox Code Playgroud)