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