скажем, строка:
$str="abcdefg foo() hijklmopqrst";
Как разрешить php вызывать foo () и вставить строку возврата в эту строку?
$str="abcdefg foo() hijklmopqrst"; function foo() {return "bar";} $replaced = preg_replace_callback("~([az]+)\(\)~", function ($m){ return $m[1](); }, $str);
вывод:
$replaced == 'abcdefg bar hijklmopqrst';
Это позволит использовать любые строчные буквы в качестве имени функции. Если вам нужны другие символы, добавьте их в шаблон, т. [a-zA-Z_]
.
Будьте ОЧЕНЬ осторожны, какие функции вы позволяете вызывать. Вы должны, по крайней мере, проверить, содержит ли $ m [1] функцию белого списка, чтобы не допускать удаленные атаки на ввод кода.
$allowedFunctions = array("foo", "bar" /*, ...*/); $replaced = preg_replace_callback("~([az]+)\(\)~", 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);
Если вы вызываете метод некоторого класса, вы можете использовать нормальное расширение переменной. Например:
<?php class thingie { public function sayHello() { return "hello"; } } $t = new thingie(); echo "thingie says: {$t->sayHello()}";
Это приведет к выводу:
thingie говорит: привет
Обратите внимание, что требуются скобки вокруг вызова.
Просто используйте это:
$str = "abcdefg".foo()."hijklmnopqrstuvwxyz";
Он будет вызывать функцию во время создания строки.
$foo = foo(); $str = "abcdefg {$foo} hijklmopqrst";
function foo() { return 'Hi'; } $my_foo = 'foo'; echo "{$my_foo()}";