【问题标题】:handling php eval syntax error for mathematic equations处理数学方程的 php eval 语法错误
【发布时间】:2011-07-25 20:02:13
【问题描述】:

假设我在 php 中这样做:


eval("\$answer=1--1;");

表达式 1--1 会导致 eval 出现语法错误,我的问题是如何检测错误并优雅地处理它?即:在 eval 中捕获错误,然后打印出有用的消息。现在,它只是吐出“解析错误:语法错误,意外的 T_DEC”。不幸的是,php 手册指出使用 set_error_handler() 函数无法捕获解析错误。

这是一个简单的学校作业,他们建议使用“eval()”。 由于任务是微不足道的,也许不必担心这些罕见的情况。

【问题讨论】:

  • 解析错误应该得到解决。避免评估

标签: php


【解决方案1】:

通过在eval 前面加上@ 符号来抑制错误输出,然后通过检查error_get_last()

$test = @eval($str);
if (error_get_last())
    var_dump(error_get_last());

然后,针对列表解析错误消息中引用的 PHP 令牌('message' 值,或 T_DEC):http://php.net/manual/en/tokens.php

但是,某些解析错误可能会使您的整个脚本失败,例如调用未定义的函数。而且,由于您抑制了错误输出,因此故障不会出现在您的日志中。基本上:避免eval 用于除有趣的玩具以外的任何东西来打发时间。

编辑:我假设"\$answer=1--1;" 并不是您要检查的值(太明显了),而只是您可能传递给 eval 的字符串类型的测试示例。如果是真的,你应该在那里修复它。但是如果你想在 eval 中传递和检查任何字符串,那么上面的方法会有所帮助。

【讨论】:

  • 而公认的解决方案是使用一种糟糕的方法,通过使用另一种糟糕的方法来加剧原始问题。
  • @Mark Ba​​ker:并非所有上下文都是邪恶的。就我们所知,上下文可能是为了学习目的而制作自己的交互式外壳。 “基本上:除了一个有趣的玩具来打发时间之外,避免对任何东西进行评估。”正如 OP 所说:“由于任务是微不足道的,也许没有必要担心这些罕见的情况。”
  • 我担心这是一个学校作业,是学校建议使用 eval()。如果学校教这样的坏习惯,那么肯定是像 SO 这样的在线开发社区有责任这样做,而不是进一步传播坏习惯
  • @Mark Ba​​ker:你有没有建议一种简单的方法来评估在 PHP 中存储为字符串的算术表达式?这项任务的重要性非常小,我敢打赌,建议使用 eval() 只是因为它是完成问题的最快方法。
  • @DamonKashu - 我建议使用 PHPClasses phpclasses.org/package/… 的 evalmath 类,它有一些缺陷,但通常为解析和评估数学公式提供了一个很好的沙箱
【解决方案2】:

对数学方程使用 eval 的原因不止一个。
因为周围有成千上万的数学解析器。安全且可维护。

【讨论】:

  • +1 - 我同意上校的观点......不要使用 eval(),尽管他本可以更有帮助,并且实际上为你指出了一个安全的数学解析器......但是+1 以抵消投反对票的人
【解决方案3】:
  1. 在字符串前面加上echo 'd41d8cd98f00b204e9800998ecf8427e'; 之类的东西。
  2. Turn on output buffering
  3. 评估
  4. Get contents of the output buffer and delete it
  5. 测试内容是否以'd41d8cd98f00b204e9800998ecf8427e'开头。

或者,使用Parsekit

【讨论】:

    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2011-05-24
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多