相关疑难解决方法(0)

PHP eval和捕获错误(尽可能多)

免责声明 ; 我完全了解eval的陷阱和"邪恶",包括但不限于:性能问题,安全性,可移植性等.

问题

阅读eval上的PHP手册...

除非在计算代码中调用return,否则eval()将返回NULL,在这种情况下,将返回传递给return的值.如果计算代码中存在解析错误,则eval()返回FALSE并继续执行以下代码.使用set_error_handler()无法在eval()中捕获解析错误.

简而言之,除了返回false之外没有错误捕获,这是非常有帮助的,但是我可以做得更好!

原因

我正在研究的网站功能的一部分依赖于执行表达式.我不想通过沙盒或执行模块的路径,所以我结束了使用eval.在你喊"如果客户变坏了怎么办?!"之前 知道客户非常信任; 他不想破坏自己的网站,任何获得此功能的人都拥有服务器,无论eval如何.

客户端知道Excel中的表达式,并不是解释这些差异的问题,但是,通过某种形式的警告几乎是标准功能.

这是我到目前为止:

define('CR',chr(13));
define('LF',chr(10));

function test($cond=''){
    $cond=trim($cond);
    if($cond=='')return 'Success (condition was empty).'; $result=false;
    $cond='$result = '.str_replace(array(CR,LF),' ',$cond).';';
    try {
        $success=eval($cond);
        if($success===false)return 'Error: could not run expression.';
        return 'Success (condition return '.($result?'true':'false').').';
    }catch(Exception $e){
        return 'Error: exception '.get_class($e).', '.$e->getMessage().'.';
    }
}
Run Code Online (Sandbox Code Playgroud)

笔记

  • 该函数在任何情况下都返回一个消息字符串
  • 代码表达式应该是PHP的单行代码,没有PHP标记,也没有结尾的分号
  • 新行将转换为空格
  • 添加一个变量来包含结果(表达式应返回true或false,并且为了不与eval的返回冲突,使用临时变量.)

那么,您还会添加什么来进一步帮助用户?是否有任何进一步的解析功能可以更好地查明可能的错误/问题?

克里斯.

php parsing eval exception

25
推荐指数
3
解决办法
2万
查看次数

如何在php中处理eval函数的解析错误

我正在尝试使用php的eval函数.但我一直在处理解析错误.喜欢考虑我是否有像1 ..或1 ++这样的边缘情况如果给我解析错误:语法错误,.....

有谁知道如何处理语法错误或如何绕过错误消息?我想提供更好的错误消息.

还可以将错误消息存储到变量中吗?

TIA

php error-handling syntax-error

4
推荐指数
3
解决办法
7331
查看次数

标签 统计

php ×2

error-handling ×1

eval ×1

exception ×1

parsing ×1

syntax-error ×1