<?php
function compute($input){
$compute = create_function('', 'return '.$input.';');
return 0 + $compute();
}
$test = array(
'5 + 5',
'3 +( 2 * 3)',
'(3 + 2) * 3',
'3 + 2 * 3',
'(3-2-1)*3'
);
foreach( $test AS $string){
echo compute( $string);
echo "<br />";
}
http://sandbox.onlinephpfunctions.com/code/61ee53b5477d7450ff89f4f012915a44e609000b
以上代码在PHP 7.2中已弃用。其他大多数遇到此问题的人都被告知要使用匿名函数。但是在这种情况下,我不知道如何使用它。
Tnx帮助我:/
答案 0 :(得分:0)
如果您真的想在整个解决方案中继续使用PHP,那么一个简单的解析器(也许是递归下降的)或类似this one就能很好地完成工作。您可以很容易地使用这样的系统来评估自定义公式,而不必求助于eval。
我个人而言,我想要一些可以安全地评估php中整个函数(包括循环,条件等)的东西,所以我使用了一个非常轻巧的javascript解释器duktape,可以是compiled into php 7 as a module。然后,您可以调用它来评估javascript函数,这些函数本质上是简单的,除了能够返回值并从原始脚本获取输入之外,没有输入/输出功能。
这是我的操作方式:
/* Execute a javascript function. Requires the duktape extension to be included in PHP.
* Accepts an array of variables by name to include as parameters to the called code.
* The code is expected to return a value, which should be scalar (numeric, string or null).
*/
function jsfunction($inputs, $code)
{
$duktape = new Duktape();
$javascript = "function e() {";
foreach ($inputs as $name=>$value) {
$javascript .= "var " . $name . ' = ' . json_encode((object)$value) . ";\n";
}
$javascript .= $code . "}\ne();";
try {
$result = $duktape->eval($javascript);
}
catch (Exception $e) {
return null;
}
return $result;
}
参数必须作为名称/值对的数组传递,例如传递['a'=> 42]将使名称对变量javascript可见,名称为'a',其值为42。$ code包含一个javascript函数体,在其周围没有大括号,该函数体必须以return语句结尾。 / p>
希望这会有所帮助!
答案 1 :(得分:0)
哇,编写您自己的'eval()'函数的效率真低。但是对于在受感染的系统上保持持久性很有用。也许这是不推荐使用该功能的原因?
如果您要解决的问题是 测试用例,则可以使用eval(具有经过验证的输入-/^[^0-9 +-*\/\(\)]$/
)或使用lib specifically designed for resolving such expressions。
如果您不是尝试实现多态代码,那么匿名函数会很简单(恰好实现了多态代码!):
$compute = function () use ($arg) {
if (preg_match('/^[^0-9 +-*\/\(\)]$/', $arg)) {
return eval('return '.$arg . ';');
}
return false;
};