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

lov*_*ing 9 php

比如说,字符串是:

$str="abcdefg foo() hijklmopqrst";
Run Code Online (Sandbox Code Playgroud)

如何让php调用foo()并将返回字符串插入此字符串?

Hon*_*ule 24

如果您正在调用某个类的方法,则可以使用常规变量扩展.例如:

<?php
class thingie {

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

}

$t = new thingie();
echo "thingie says: {$t->sayHello()}";
Run Code Online (Sandbox Code Playgroud)

这将输出:

thingie说:你好

请注意,呼叫周围的大括号必需的.

  • 但似乎以这种方式调用全局函数是行不通的 (4认同)

Fre*_*oux 15

只要用这个:

$str = "abcdefg".foo()."hijklmnopqrstuvwxyz";
Run Code Online (Sandbox Code Playgroud)

它将在字符串创建期间调用函数.

  • @lovespring这是一个可怕的设置.你使用什么API来做到这一点? (3认同)

Bas*_*sti 8

$str="abcdefg foo() hijklmopqrst";
function foo() {return "bar";}

$replaced = preg_replace_callback("~([a-z]+)\(\)~", 
     function ($m){
          return $m[1]();
     }, $str);
Run Code Online (Sandbox Code Playgroud)

输出:

$replaced == 'abcdefg bar hijklmopqrst';
Run Code Online (Sandbox Code Playgroud)

这将允许任何小写字母作为函数名称.如果您需要任何其他符号,请将它们添加到模式中,即[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);
Run Code Online (Sandbox Code Playgroud)

Testrun关于"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);
Run Code Online (Sandbox Code Playgroud)


sav*_*ger 6

$foo = foo();
$str = "abcdefg {$foo} hijklmopqrst";
Run Code Online (Sandbox Code Playgroud)


v.b*_*bak 6

function foo()
{
    return 'Hi';
}
$my_foo = 'foo';
echo "{$my_foo()}";
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很棒的“把戏”。您甚至可以向其传递参数或其他变量。`echo“ {$ my_foo('bar')}”`或`echo“ {$ my_foo($ bar)}”`-在构建具有多个转义值的SQL查询时特别有用。 (2认同)

Val*_*ozz 5

要从双引号字符串计算任意表达式,您可以推测变量函数:

<?php
// A user function
function foo() {
    return 'bar';
}

/**
 * The hack
 *
 * @param $v mixed Value
 * return mixed Value (untouched)
 */
$_ = function ( $v ) {
    return $v;
};

// Happy hacking
echo "Foo is {$_( foo() )} and the sum is {$_( 41 + 1 )}...{$_( str_repeat( ' arrh', 3 ) )}!";
Run Code Online (Sandbox Code Playgroud)

结果:

Foo is bar and the sum is 42... arrrh arrrh arrrh!
Run Code Online (Sandbox Code Playgroud)

参考:


Mub*_*har 5

它仍然不可能,有可用的黑客,但不是我推荐的,而是建议坚持使用老式点运算符,即$str="abcdefg ". foo() ." hijklmopqrst";

根据复杂(卷曲)语法文档

注意:
自 PHP 5 起,{$} 中的函数、方法调用、静态类变量和类常量都可以工作。但是,访问的值将被解释为定义字符串的范围内的变量名称。使用单花括号 ({}) 无法访问函数或方法的返回值或者类常量或静态类变量的值。