如何使用正则表达式匹配所有php函数参数名称?

时间:2016-04-24 18:44:42

标签: php regex

我对正则表达式没有多少经验。我面临以下问题: 我想在方法的PHP声明代码中找到所有参数名称。

例如:

public function foo($param1, $param2, $param3) {}

当正则表达式应用于此代码时,它应该给我匹配param1,param2和param3。在尝试解决这个问题时,我来到了以下正则表达式:

/\((?:[\,\s\w]*\$(\w+)[\,\s\w]*)+\)/g

我的想法是:

  • 声明分隔符\(\)
  • 声明参数匹配组\$(\w+)
  • 因为它立即匹配分隔符:
    • 声明获取逗号,任何空格和任何字母的可能性(仅适用于类型提示)[\,\s\w]*
    • 使上述组环绕参数名称组。 [\,\s\w]*\$(\w+)[\,\s\w]*
    • 声明一个非捕获组,所以我可以说整个组实际上可以出现不止一次。 (?:[\,\s\w]*\$(\w+)[\,\s\w]*)+

不幸的是,我无法在分隔符(括号)中匹配并获取所有参数名称。所有这个正则表达式都匹配整个方法的参数声明,并且在名称组中,它只匹配最后一个,并且它是param3名称。

有谁比我更有经验,可以帮我解决一下这个小谜题吗?我一直在使用http://regexr.com/。从现在开始,感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

不是正则表达式,但它有效。

$str='public function foo($param1, $param2, $param3) {}';

$str2 = explode(")",explode("(",$str)[1])[0];
$str2 = explode(",",str_replace("$","",$str2));
var_dump($str2);

http://sandbox.onlinephpfunctions.com/code/b2c2f58ca859e714a169455573ea3fabc8694e84

答案 1 :(得分:1)

\$([a-z[0-9][^,\)]]+)应该有效

解释: 搜索$,取除除(或)之外的每个字母数字值并将结果分组 使用www.regexe.de

进行测试

结果:

$param1
$param2
$param3

答案 2 :(得分:1)

假设我们有更复杂的功能文字描述和“类型提示”。
使用preg_match_all函数的解决方案:

$func_str = 'public function foo(Closure $param1, $param2 = [], $param3="") {}';

preg_match_all("/\s[$](\w+?)\b/i", $func_str, $matches);

print_r($matches[1]);

输出:

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

答案 3 :(得分:1)

我意识到你正在要求一个正则表达式解决方案,但是已经发布了3个正则表达式的答案,因为它已经内置到php中,因此使用Reflection更有意义。因此,出于这些原因,这是一个Reflection答案

class Bar {
    public function foo($param1, $param2, $param3) {}
}

$class = new ReflectionClass('Bar');
var_dump($class->getMethod('foo')->getParameters());

array(3) {
  [0] =>
  class ReflectionParameter#3 (1) {
    public $name =>
    string(6) "param1"
  }
  [1] =>
  class ReflectionParameter#4 (1) {
    public $name =>
    string(6) "param2"
  }
  [2] =>
  class ReflectionParameter#5 (1) {
    public $name =>
    string(6) "param3"
  }
}