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

时间:2013-11-07 23:17:17

标签: php regex arrays preg-match-all

我想使用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
            )

    )

我尝试用括号解决涉及递归模式的问题。

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

输出:

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

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

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

    )

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

有没有办法获得元素数组?

问候和感谢!

3 个答案:

答案 0 :(得分:2)

呃,你的正则表达式过于复杂。

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

输出:

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

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

)

所以你想要的输出只是$matches[1]

答案 1 :(得分:1)

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

preg_match_all('~\G{([^}]+)}(?:&|$)~', '{a}&{b}&{c}&{d&}', $result);

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

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

答案 2 :(得分:0)

对于您以前的问题,请尝试:

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

得到:

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