0

我有一个字符串包含以下模式“[link:activate/$id/$test_code]”当模式 [link.....] 出现时,我需要从中获取单词 activate、$id 和 $test_code。

我还尝试通过使用分组来获取内部项目,但只能激活并且 $test_code 无法获取 $id。请帮我获取数组中的所有参数和动作名称。

下面是我的代码和输出

代码

function match_test()
{
    $string  =  "Sample string contains [link:activate/\$id/\$test_code] again [link:anotheraction/\$key/\$second_param]]] also how the other ationc like [link:action] works";
    $pattern = '/\[link:([a-z\_]+)(\/\$[a-z\_]+)+\]/i';
    preg_match_all($pattern,$string,$matches);
    print_r($matches);
}

输出

    Array
    (
        [0] => Array
            (
                [0] => [link:activate/$id/$test_code]
                [1] => [link:anotheraction/$key/$second_param]
            )

        [1] => Array
            (
                [0] => activate
                [1] => anotheraction
            )

        [2] => Array
            (
                [0] => /$test_code
                [1] => /$second_param
            )

    )
4

2 回答 2

0

尝试这个:

$subject = <<<'LOD'
Sample string contains [link:activate/$id/$test_code] again [link:anotheraction/$key/$second_param]]] also how the other ationc like [link:action] works
LOD;
$pattern = '~\[link:([a-z_]+)((?:/\$[a-z_]+)*)]~i';
preg_match_all($pattern, $subject, $matches);
print_r($matches);

如果您需要拥有\$id\$test_code分开,您可以使用它来代替:

$pattern = '~\[link:([a-z_]+)(/\$[a-z_]+)?(/\$[a-z_]+)?]~i';
于 2013-07-16T08:24:30.827 回答
0

这是你想要的?

/\[link:([\w\d]+)\/(\$[\w\d]+)\/(\$[\w\d]+)\]/

编辑:

你的表达的问题也是这部分: (\/\$[a-z\_]+)+

尽管您已经重复了组,但匹配只会返回一个,因为它仍然只是一个组声明。正则表达式不会为您发明匹配的组号(无论如何我都没有见过)。

于 2013-07-16T08:18:53.237 回答