所以,是的,eval()
经常被视为 php 中最严重的“邪恶”之一。在大多数情况下,当一项任务需要通过以下方式解决时eval()
或变量变量(基本上是包装不良的数组),这是不正确存储/声明数据的症状,通常最好的行动方案是彻底重新思考。
为了解决您的孤立问题而不从根本上重写自定义函数,我将提供一个较小的“邪恶”(但在我看来仍然是一个“邪恶”,因为它的使用存在风险)--GLOBALS
& global
...
Code: (Demo https://3v4l.org/HJL6s)
function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
global $pippo; // declare $pippo as a global variable
$pippo = 'Pizza';
return preg_replace_callback('/{{ \$(.*?) }}/', function($m) use ($pippo) {
echo "Global: " , $GLOBALS['pippo'];
echo "\n{$m[1]}\n";
return $GLOBALS[$m[1]] ?? $m[0]; // null coalescing operator provides fallback
},$value);
}
echo parseDbString();
Output:
Global: Pizza # <-- for demonstraton purposes
pippo # <-- for demonstraton purposes
Looking for a good Pizza # <-- desired output
...那么为什么这个解决方法是一个“坏主意”,好吧,想象一下你有一个包含{{ $db }}
-- 这样一个常见的变量名很可能存在于你的全局变量列表中。所以如果{{ variable }}
如果您的字符串与全局范围内的任何变量匹配,您将得到错误的结果。
怎么办should你做?只需声明您的$pippo
数组中的数据,以便您可以利用关联关系。 (Demo https://3v4l.org/FpQJL)
function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
$lookup = ['pippo' => 'Pizza'];
return preg_replace_callback('/{{ \$(.*?) }}/', function($m) use ($lookup) {
return $lookup[$m[1]] ?? $m[0]; // null coalescing operator provides fallback
}, $value);
}
echo parseDbString();
根据您对输入数据的控制程度,您现在可以删除$
before pippo
在你的输入字符串中——这消除了一些不必要的字符。
如果你还在阅读,你可以用以下命令清理整个内容strtr()
or str_replace()
. (Demo https://3v4l.org/rYTNT)
function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
$lookup = ['{{ $pippo }}' => 'Pizza']; // this can be extended all you like!
return strtr($value, $lookup);
}
echo parseDbString();