在逻辑运算中替换eval()php



我正在进行类似的逻辑验证

$answer = eval("return ".$stringToValidate.";"); 

其中CCD_ 1是类似于CCD_ 2或CCD_。

问题是当我引入像a == 'b'100 <<< 200这样的无效字符串时。

我正在寻找eval函数的替代品或尝试捕获语法错误

我试着使用像一样的try-catch

try{
$answer = eval("return ".$stringToValidate.";");
}catch(Exception $e){
return $e->getMessage();
}

但不起作用

我期望eval函数的输出true和false,以及语法错误的异常控制

编辑:

我尝试了重复的解决方案,但有同样的问题,使用try-catch或函数PHP eval并捕获错误(尽可能多)

特别是如果使用表达式10000 < 20000 < 30000并得到文本错误syntax error, unexpected '<'我研究了symfony表达式语言工具https://symfony.com/doc/current/components/expression_language.html但当表达失败时,抛出false,我无法区分坏的表达和false的表达

EDIT2:无法捕获分析错误http://php.net/manual/en/function.set-error-handler.php

如果你使用PHP 7,你可以使用ParserError:

error_reporting(E_ALL);

$stringToValidate = "'a == 'b'";
try {
$answer = eval("return ".$stringToValidate.";");
} catch(Exception $e){
return $e->getMessage();
} catch (ParseError $e) {
echo 'Bad request !';
}

编辑:参见cmbuckley评论

最新更新