2013-04-29 82 views
1

说我有以下字符串:Func(param1, param2)与未知数量的参数。
我想下面的数组:捕获重复子图案

Array(
    [0] => Func(param1, param2), 
    [1] => Func 
    [2] => param1, 
    [3] => param2, 
    ... 
) 

我尝试这样做:

$str = 'Func(param1, param2)'; 
preg_match('/^([a-z]+)\((?:([a-z0-9]+)\s*,?\s*)*\)$/i', $str, $matches); 
print_r($matches); 

这是输出:

Array 
(
    [0] => Func(param1, param2) 
    [1] => Func 
    [2] => param2 
) 

捕获的PARAMS捕获子模式只有最后一个参数。我希望它捕获所有参数。

任何想法?

编辑:
我知道我可以捕获所有的参数,然后使用爆炸。但那不是我的问题。
我想知道它是如何处理正则表达式的。

+2

我不得不disapoint你,但你想要什么**在PHP **中是不可能的,几乎所有语言都是一样的[除了Perl 6和.NET](http://stackoverflow.com/a/6571139/)。它被称为**重复捕获组**,它已经被问到[这里](http://stackoverflow.com/q/6371226/)和[这里](http://stackoverflow.com/q/6579908/)。 – HamZa 2013-04-29 13:02:35

+0

@HamZa DzCyber​​DeV好的,谢谢。 – 2013-04-29 13:12:33

回答

-1

你可以得到所有PARAMS一次,然后用explode得到该字符串数组:

$str = 'Func(param1, param2)'; 
preg_match('/^([a-z]+)\(([a-z0-9\,\s]+)\)$/i', $str, $matches); 
print_r($matches); 

$params = explode(',', str_replace(' ', '', $matches[2])); 

print_r($params); 
+0

我知道。但我的问题是我如何能够做到这一点,而不爆炸。 – 2013-04-29 12:30:07

+0

是的,我看到了你的编辑。我会看看,但那是我想到的第一件事。你有没有使用爆炸的严重原因? – enenen 2013-04-29 12:31:34

+1

不,但我想知道是否有办法做到这一点,而不使用爆炸。 – 2013-04-29 12:36:37

0

这应该这样做:

$str = 'Func(param1, param2, param32, param54, param293, par13am, param)'; 
preg_match_all("/(.*)[\(|\](.*)[,|\)]/U", $str, $match); 

print_r($match[1]); 
//output: Array ([0] => Func [1] => param1 [2] => param2 [3] => param32 [4] => param54 [5] => param293 [6] => par13am [7] => param) 
+0

它不是固定的,我举这个例子为例。我怎样才能做到这一点而不爆炸?谢谢。 :) – 2013-04-29 12:29:16

+0

应该这样做,我改为preg_match_all,而你想要的数组是$ match [1] – aleation 2013-04-29 13:38:20