我正在进行类似的逻辑验证
$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评论