Php 相当于preg_match,它返回相当(多维)的数组

Php 相当于preg_match,它返回相当(多维)的数组,php,regex,multidimensional-array,Php,Regex,Multidimensional Array,是否有一些PHP函数或库,根据正则表达式中的括号将正则表达式的结果返回为相当多维的数组?这就是我的意思: preg_match('/(n(e?)c)(o)/', 'neco', $vysl); var_dump($vysl); 返回以下内容: array(4) { [0]=> string(4) "neco" [1]=> string(3) "nec" [2]=> string(1) "e" [3]=> string(1) "o" }

是否有一些PHP函数或库,根据正则表达式中的括号将正则表达式的结果返回为相当多维的数组?这就是我的意思:

preg_match('/(n(e?)c)(o)/', 'neco', $vysl);
var_dump($vysl);
返回以下内容:

array(4) {
  [0]=>
  string(4) "neco"
  [1]=>
  string(3) "nec"
  [2]=>
  string(1) "e"
  [3]=>
  string(1) "o"
}
我希望有这样的输出:

array(3) {
  [0]=>
  string(4) "neco"
  [1]=>
  array(2) {
    [0]=>
    string(3) "nec"
    [1]=>
    string(1) "e"
  }
  [2]=>
  string(1) "o"
}

每个子表达式结果在该数组中的预期深度。

有趣的问题!没有这种内置的东西,您必须捕获匹配的偏移量,并为每个匹配检查其偏移量是否在其他人的范围内:这让我想起嵌套集模型:

function match_tree($re, $subject) {
    preg_match($re, $subject, $ms, PREG_OFFSET_CAPTURE);

    $p = [(object)[]];

    foreach($ms as $m) {
        $m = (object) [
            'le'  => $m[1],
            'ri'  => $m[1] + strlen($m[0]) - 1,
            'str' => $m[0]];

        for($i = count($p) - 1; $i >= 0; $i--) {
            if(!$i || ($m->le >= $p[$i]->le && $m->le <= $p[$i]->ri)) {
                $p []= $m;
                $p[$i]->sub []= $m;
                break;
            }
        }
    }

    return $p[0];
}
返回

stdClass Object
(
    [sub] => Array
        (
            [0] => stdClass Object
                (
                    [le] => 1
                    [ri] => 9
                    [str] => necofoabc
                    [sub] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [le] => 1
                                    [ri] => 3
                                    [str] => nec
                                    [sub] => Array
                                        (
                                            [0] => stdClass Object
                                                (
                                                    [le] => 2
                                                    [ri] => 2
                                                    [str] => e
                                                )

                                        )

                                )

                            [1] => stdClass Object
                                (
                                    [le] => 4
                                    [ri] => 4
                                    [str] => o
                                )

                            [2] => stdClass Object
                                (
                                    [le] => 5
                                    [ri] => 9
                                    [str] => foabc
                                    [sub] => Array
                                        (
                                            [0] => stdClass Object
                                                (
                                                    [le] => 6
                                                    [ri] => 9
                                                    [str] => oabc
                                                    [sub] => Array
                                                        (
                                                            [0] => stdClass Object
                                                                (
                                                                    [le] => 7
                                                                    [ri] => 9
                                                                    [str] => abc
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

打印而不是vardump?vardump没有问题,但是preg_match返回的数组格式有问题。没有格式化数组。Preg_match返回一个普通数组,您看到的格式是vardump输出数组的方式。太好了!这就是我想要的。谢谢我想你的代码应该是PEAR.:-向你表示敬意。你写这段代码的速度比我快。。。
stdClass Object
(
    [sub] => Array
        (
            [0] => stdClass Object
                (
                    [le] => 1
                    [ri] => 9
                    [str] => necofoabc
                    [sub] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [le] => 1
                                    [ri] => 3
                                    [str] => nec
                                    [sub] => Array
                                        (
                                            [0] => stdClass Object
                                                (
                                                    [le] => 2
                                                    [ri] => 2
                                                    [str] => e
                                                )

                                        )

                                )

                            [1] => stdClass Object
                                (
                                    [le] => 4
                                    [ri] => 4
                                    [str] => o
                                )

                            [2] => stdClass Object
                                (
                                    [le] => 5
                                    [ri] => 9
                                    [str] => foabc
                                    [sub] => Array
                                        (
                                            [0] => stdClass Object
                                                (
                                                    [le] => 6
                                                    [ri] => 9
                                                    [str] => oabc
                                                    [sub] => Array
                                                        (
                                                            [0] => stdClass Object
                                                                (
                                                                    [le] => 7
                                                                    [ri] => 9
                                                                    [str] => abc
                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)