$str="abcdefg foo() hijklmopqrst";
function foo() {return "bar";}
$replaced = preg_replace_callback("~([a-z]+)\(\)~",
function ($m){
return $m[1]();
}, $str);
输出:
$replaced == 'abcdefg bar hijklmopqrst';
这将允许任何小写字母作为函数名。如果您需要任何其他符号,请将它们添加到模式中,即[a-zA-Z_]。
非常小心您允许调用的函数。您至少应该检查 $m[1] 是否包含列入白名单的函数以不允许远程代码注入攻击。
$allowedFunctions = array("foo", "bar" /*, ...*/);
$replaced = preg_replace_callback("~([a-z]+)\(\)~",
function ($m) use ($allowedFunctions) {
if (!in_array($m[1], $allowedFunctions))
return $m[0]; // Don't replace and maybe add some errors.
return $m[1]();
}, $str);
在"abcdefg foo() bat() hijklmopqrst" 上测试运行输出"abcdefg bar bat() hijklmopqrst"。
优化白名单方法(从允许的函数名称动态构建模式,即(foo|bar)。
$allowedFunctions = array("foo", "bar");
$replaced = preg_replace_callback("~(".implode("|",$allowedFunctions).")\(\)~",
function ($m) {
return $m[1]();
}, $str);