繁体   English   中英

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

[英]How to use regex to match all php function parameter names?

我对正则表达式没有太多经验。 我面临以下问题:我想在方法的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/ 从现在开始,感谢您的帮助。

不是正则表达式,但它可以工作。

$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

\\$([az[0-9][^,\\)]]+)应该可以

说明:搜索$,获取除或以外的所有字母数字值并将结果分组
经过www.regexe.de测试

结果:

$param1
$param2
$param3

假设我们使用“类型提示”对功能文本进行了更复杂的描述。
使用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个正则表达式答案,并且使用Reflection来实现此目的更有意义,因为它已经内置在php中。 因此,出于这些原因,这是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"
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM