在逻辑操作中替换eval()php

时间:2019-01-02 14:47:06

标签: php laravel eval

我正在像

那样进行逻辑验证
$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函数的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

1 个答案:

答案 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评论