【问题标题】:PHP: get array with preg_* functionsPHP:使用 preg_* 函数获取数组
【发布时间】:2013-11-07 23:17:16
【问题描述】:

我想使用 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 并没有解决我的问题。

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

问候和感谢!

【问题讨论】:

标签: php regex arrays preg-match-all


【解决方案1】:

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

$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]

【讨论】:

  • 谢谢。那么,我应该做两遍来解析$data吗?因为 $data = "{a}|{b}&{c}|{d&}";是一个字符串成功。之后,我应该检查 '&' 字符。
【解决方案2】:

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

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

\G 表示“与先前匹配或在字符串的开头连续”。因此,不允许有空格,语法由模式检查。

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

【讨论】:

  • 哦,谢谢!这行得通。我应该查看问题转义序列。
【解决方案3】:

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

$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
        )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多