PHP:使用preg_*函数获取数组

PHP:使用preg_*函数获取数组,php,regex,arrays,preg-match-all,Php,Regex,Arrays,Preg Match All,我想使用PHP的正则表达式解析并得到一个二维矩阵。但我真的不知道如何解析和获取数组(一维)。例如,我有以下字符串: $str = {a}&{b}&{c}&{d&}; 我想转换成如下数组: array( 'a', 'b', 'c', 'd&' ) 模式应为: $pattern = '#(({[^}]+})(?:&(?1))*#'; 模式匹配正确,但我无法获取带有$matches参数的所有元素: preg_matc

我想使用PHP的正则表达式解析并得到一个二维矩阵。但我真的不知道如何解析和获取数组(一维)。例如,我有以下字符串:

    $str = {a}&{b}&{c}&{d&};
我想转换成如下数组:

    array( 'a', 'b', 'c', 'd&' )
模式应为:

    $pattern = '#(({[^}]+})(?:&(?1))*#';
模式匹配正确,但我无法获取带有$matches参数的所有元素:

    preg_match_all( $pattern, $str, $matches );
    print_r( $matches );
输出:

    Array
    (
        [0] => Array
            (
                [0] => {a}&{b}&{c}&{d&}
            )

        [1] => Array
            (
                [0] => a
            )

    )
    Array
    (
        [0] => Array
            (
                [0] => {a}&{b}&{c}&{d&}
            )

        [1] => Array
            (
                [0] => a
            )

        [2] => Array
            (
                [0] => d&
            )

    )
Array
(
    [0] => Array
        (
            [0] => {a}
            [1] => {b}
            [2] => {c}
            [3] => {d&}
        )

    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
            [3] => d&
        )

)
我试图解决这个包含括号的递归模式的问题

    $pattern = '#(({[^}]+})(?:&((?1)))*#';
输出:

    Array
    (
        [0] => Array
            (
                [0] => {a}&{b}&{c}&{d&}
            )

        [1] => Array
            (
                [0] => a
            )

    )
    Array
    (
        [0] => Array
            (
                [0] => {a}&{b}&{c}&{d&}
            )

        [1] => Array
            (
                [0] => a
            )

        [2] => Array
            (
                [0] => d&
            )

    )
Array
(
    [0] => Array
        (
            [0] => {a}
            [1] => {b}
            [2] => {c}
            [3] => {d&}
        )

    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
            [3] => d&
        )

)
仅获取数组的最后一个元素。选项标志PREG_PATTERN_ORDER或con PREG_SET_ORDER没有解决我的问题

有没有办法得到元素数组


问候和感谢

呃,你的正则表达式太复杂了

$pattern = "#{([^}]+)}#";
$data = "{a}&{b}&{c}&{d&}";
preg_match_all($pattern, $data, $matches);
print_r($matches);
输出:

    Array
    (
        [0] => Array
            (
                [0] => {a}&{b}&{c}&{d&}
            )

        [1] => Array
            (
                [0] => a
            )

    )
    Array
    (
        [0] => Array
            (
                [0] => {a}&{b}&{c}&{d&}
            )

        [1] => Array
            (
                [0] => a
            )

        [2] => Array
            (
                [0] => d&
            )

    )
Array
(
    [0] => Array
        (
            [0] => {a}
            [1] => {b}
            [2] => {c}
            [3] => {d&}
        )

    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
            [3] => d&
        )

)

因此,您所需的输出仅为
$matches[1]

对于前一个问题,请尝试:

$str = "a&b&c&d&word";
$pattern = '/[^&]+/';
preg_match_all( $pattern, $str, $matches );
print_r( $matches );
获取:


您可以使用此模式捕获花括号内的内容并检查语法(即
{..}&{..}&{..}&{..}&{..}&{..}
):

\G
表示“与先前匹配相邻或在字符串开头”。因此,不允许有间隙,并且由模式检查语法


您正在查找的数组是
$result[1]

只要使用像这样使用的模式,它甚至会匹配嵌套的
{}
:DThanks。那么,我应该做两次传递来解析$data吗?因为$data=“{a}{124;{b}&{c}{124;{d&}”;字符串是否成功。之后,我应该检查“&”字符。哦,谢谢!这很有效。我应该回顾一下问题转义序列。