【发布时间】:2019-05-29 05:17:19
【问题描述】:
我正在做类似的逻辑验证
$answer = eval("return ".$stringToValidate.";");
其中$stringToValidate 是一个逻辑表达式,如'a' == 'b' 或100 < 200。
问题是当我引入无效字符串时,例如 a == 'b' 或 100 <<< 200。
我正在寻找 eval 函数或 try-catch 语法错误的替代品
我正在尝试使用 try catch
try{
$answer = eval("return ".$stringToValidate.";");
}catch(Exception $e){
return $e->getMessage();
}
但没用
我期望 eval 函数的输出真假和语法错误的异常控制
编辑:
我尝试了重复的解决方案并遇到同样的问题,使用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
【问题讨论】:
-
a == 'b'会在我尝试时生成警告,而不是异常。100 <<< 200生成解析错误,您无法捕获。 -
更好的副本:PHP eval and capturing errors (as much as possible) - TL;DR 使用 PHP7 并捕获
ParseError。 -
@cmbuckley 干杯,我已将其添加到受骗者列表中。
-
谢谢,我刚刚注意到这个链接可以让我自己在未来这样做;-)
-
@ceejayoz 是否存在捕获该解析错误的任何形式?