处理数学方程的php eval语法错误

时间:2011-03-30 05:37:06

标签: php

假设我在php中执行此操作:


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

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

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

3 个答案:

答案 0 :(得分:1)

  1. 在字符串前加上echo 'd41d8cd98f00b204e9800998ecf8427e';
  2. 之类的字符串
  3. Turn on output buffering
  4. EVAL
  5. Get contents of the output buffer and delete it
  6. 测试内容是否以'd41d8cd98f00b204e9800998ecf8427e'开头。
  7. 或者,使用Parsekit

答案 1 :(得分:1)

将数学方程式使用eval没有一个理由 因为周围有数以千计的数学解析器。安全可维护。

答案 2 :(得分:0)

@符号预先设置为eval以抑制错误输出,然后选中error_get_last()

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

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

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

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