在 PHP 中,如何调用在字符串中插入的函数?

新手上路,请多包涵

假设字符串是:

 $str="abcdefg foo() hijklmopqrst";

如何让 php 调用 foo() 并将返回的字符串插入到该字符串中?

原文由 lovespring 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 390
2 个回答
$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);

原文由 Basti 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你正在调用某个类的方法,你可以使用普通的变量扩展。例如:

 <?php
class thingie {

  public function sayHello() {
    return "hello";
  }

}

$t = new thingie();
echo "thingie says: {$t->sayHello()}";

这将输出:

thingie 说:你好

请注意,调用周围的大括号 必需的。

原文由 HonoredMule 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏