假设我的字符串是:
$str = "abcdefg foo() hijklmopqrst";
我该如何让 PHP 调用函数 foo()
并将返回的字符串插入到该字符串的其余部分中?
假设我的字符串是:
$str = "abcdefg foo() hijklmopqrst";
我该如何让 PHP 调用函数 foo()
并将返回的字符串插入到该字符串的其余部分中?
如果你正在调用某个类的方法,你可以使用普通的变量扩展。例如:
<?php
class thingie {
public function sayHello() {
return "hello";
}
}
$t = new thingie();
echo "thingie says: {$t->sayHello()}";
请注意,调用周围的大括号是必需的。thingie 说:你好
只需使用以下代码:
$str = "abcdefg".foo()."hijklmnopqrstuvwxyz";
在字符串创建过程中将调用该函数。
function foo()
{
return 'Hi';
}
$my_foo = 'foo';
echo "{$my_foo()}";
echo "{$my_foo('bar')}"
或 echo "{$my_foo($bar)}"
。当构建具有许多转义值的 SQL 查询时,特别有用。 - Nick D$foo = foo();
$str = "abcdefg {$foo} hijklmopqrst";
$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_]
。$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);
不行。没有原生的构造来实现这个。
一个简单的连接可能更好。可能更丑,但对于PHP解析器更有效率。
嗯。是的。
如果你真的需要从双引号字符串中获取任意表达式的计算结果,你可以实现这个解决方法,利用一个叫做变量函数的特性:
<?php
/**
* The hack
*
* @param $v mixed Value
* return mixed Value (untouched)
*/
$GLOBALS['_'] = function ( $v ) {
return $v;
};
// Happy hacking
echo "Today is {$_( date( 'Y-m-d' ) )} and the max function returns {$_( max( 1, 2, 3 ) )}...{$_( str_repeat( ' arrh', 3 ) )}!";
结果:
Today is 2018-02-07 and the max function returns 3... arrh arrh arrh!
date()
, max()
和 str_repeat()
: 只要你定义的函数像 foo()
一样返回有效的字符串,你就可以调用它们。$_
。这个变量实际上是一个函数,它只返回你在第一个参数中表达的内容。这对你来说是语法糖,因为函数不能很容易地扩展到字符串中。相反,变量很容易扩展。就是这样。$str="abcdefg ". foo() ." hijklmopqrst";
。