$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);
Testrun on“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);