【问题标题】:Replace eval() php in logical operations [duplicate]在逻辑操作中替换 eval() php [重复]
【发布时间】: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 是否存在捕获该解析错误的任何形式?

标签: php laravel eval


【解决方案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 评论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2010-10-09
    • 2019-04-21
    • 2013-10-05
    相关资源
    最近更新 更多