php eval 语法错误,PHP eval和捕获错误(尽可能多)

我找到了一个很好的替代方案/答案 .

首先,让我首先说当我设置error_reporting(E_ALL)时,nikic的建议有效;通知显示在PHP输出中,并且由于OB,它们可以被捕获 .

接下来,我发现了这个非常有用的代码:

/**

* Check the syntax of some PHP code.

* @param string $code PHP code to check.

* @return boolean|array If false, then check was successful, otherwise an array(message,line) of errors is returned.

*/

function php_syntax_error($code){

if(!defined("CR"))

define("CR","\r");

if(!defined("LF"))

define("LF","\n") ;

if(!defined("CRLF"))

define("CRLF","\r\n") ;

$braces=0;

$inString=0;

foreach (token_get_all('<?php ' . $code) as $token) {

if (is_array($token)) {

switch ($token[0]) {

case T_CURLY_OPEN:

case T_DOLLAR_OPEN_CURLY_BRACES:

case T_START_HEREDOC: ++$inString; break;

case T_END_HEREDOC: --$inString; break;

}

} else if ($inString & 1) {

switch ($token) {

case '`': case '\'':

case '"': --$inString; break;

}

} else {

switch ($token) {

case '`': case '\'':

case '"': ++$inString; break;

case '{': ++$braces; break;

case '}':

if ($inString) {

--$inString;

} else {

--$braces;

if ($braces < 0) break 2;

}

break;

}

}

}

$inString = @ini_set('log_errors', false);

$token = @ini_set('display_errors', true);

ob_start();

$code = substr($code, strlen('<?php '));

$braces || $code = "if(0){{$code}\n}";

if (eval($code) === false) {

if ($braces) {

$braces = PHP_INT_MAX;

} else {

false !== strpos($code,CR) && $code = strtr(str_replace(CRLF,LF,$code),CR,LF);

$braces = substr_count($code,LF);

}

$code = ob_get_clean();

$code = strip_tags($code);

if (preg_match("'syntax error, (.+) in .+ on line (\d+)$'s", $code, $code)) {

$code[2] = (int) $code[2];

$code = $code[2] <= $braces

? array($code[1], $code[2])

: array('unexpected $end' . substr($code[1], 14), $braces);

} else $code = array('syntax error', 0);

} else {

ob_end_clean();

$code = false;

}

@ini_set('display_errors', $token);

@ini_set('log_errors', $inString);

return $code;

}

似乎很容易就能完成我所需要的(耶!)!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值