免责声明 ; 我完全了解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的eval函数.但我一直在处理解析错误.喜欢考虑我是否有像1 ..或1 ++这样的边缘情况如果给我解析错误:语法错误,.....
有谁知道如何处理语法错误或如何绕过错误消息?我想提供更好的错误消息.
还可以将错误消息存储到变量中吗?
TIA