说,字符串是:
$str="abcdefg foo() hijklmopqrst";
如何让php调用foo()并将返回字符串插入此字符串?
答案 0 :(得分:23)
如果您正在调用某个类的方法,则可以使用常规变量扩展。例如:
<?php
class thingie {
public function sayHello() {
return "hello";
}
}
$t = new thingie();
echo "thingie says: {$t->sayHello()}";
这将输出:
thingie说:你好
请注意,呼叫周围的大括号是。
答案 1 :(得分:15)
请使用:
$str = "abcdefg".foo()."hijklmnopqrstuvwxyz";
它将在字符串创建期间调用函数。
答案 2 :(得分:8)
$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 "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);
答案 3 :(得分:5)
$foo = foo();
$str = "abcdefg {$foo} hijklmopqrst";
答案 4 :(得分:5)
function foo()
{
return 'Hi';
}
$my_foo = 'foo';
echo "{$my_foo()}";
答案 5 :(得分:3)
要从双引号字符串中获取任意表达式,可以推测变量函数:
<?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 ) )}!";
结果:
Foo is bar and the sum is 42... arrrh arrrh arrrh!
参考文献:
答案 6 :(得分:2)
仍然不可能,虽然有可用的黑客手段,但我不建议使用老式的点运算符,例如$str="abcdefg ". foo() ." hijklmopqrst";
按照Complex (curly) syntax documentation
注意:
自PHP 5起,{$}中的函数,方法调用,静态类变量和类常量就可以使用。但是,所访问的值将被解释为定义字符串的作用域中的变量名。使用单花括号({})不能访问函数或方法的返回值或类常量或静态类变量的值。