Intereting Posts
Кэширование с помощью PHP для снятия стресса с MySQL добавлять активный класс к ссылкам меню, используя php Mysql Вставка или Обновление данных таблицы таблицы в другую таблицу с помощью соответствия valus Рекомендуемое изображение из внешнего URL-адреса не работает должным образом Объединение массива и ассоциативного массива Что использовать? time () или $ _SERVER ? Что лучше? Как увеличить мои «продвинутые» знания PHP дальше? (быстро) Постоянный вход в PHP – я переиздаю файл cookie после каждой проверки подлинности на странице? как получить значения, используя php variable / array (nusoap) Почему PHP не печатает TRUE / FALSE? Как предотвратить SQL-инъекцию с динамическими именами таблиц? PHP – завершение сеанса после X минут Найти url из строки с php Значения массива сумм одного и того же ключа PHP: можно ли переходить из одного случая в другой внутри коммутатора?

В PHP, Как вызвать функцию в строке?

скажем, строка:

$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()}";