我正在像
那样进行逻辑验证$answer = eval("return ".$stringToValidate.";");
其中$stringToValidate
是'a' == 'b'
或100 < 200
之类的逻辑表达式。
问题是当我引入无效的字符串,例如a == 'b'
或100 <<< 200
时。
我正在寻找替代eval函数或try-catch语法错误
我正在尝试使用
之类的try catchtry{
$answer = eval("return ".$stringToValidate.";");
}catch(Exception $e){
return $e->getMessage();
}
但是没用
我希望输出eval函数的true和false以及语法错误的异常控件
编辑:
我使用try-catch或函数PHP eval and capturing errors (as much as possible)
尝试了重复的解决方案,并遇到了相同的问题特别是如果使用表达式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
答案 0 :(得分:1)
如果使用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评论