繁体   English   中英

检查字符串是否为有效的PHP代码

[英]Check if a string is valid PHP code

我想要做:

$str = "<? echo 'abcd'; ?>";
if (is_valid_php($str)){
   echo "{$str} is valid";
} else {
   echo "{$str} is not valid PHP code";
}

有没有一种简单的方法来进行is_valid_php检查?

我所能找到的就是在线php语法检查器和用于检查语法的命令行方法,或者仅适用于文件的php_check_syntax ,我不想写文件来检查字符串是否有效。

我宁愿不使用system() / exec()eval()

相关问题 -它很旧,所以我希望有新的东西

其他相关问题 -所有选项(据我所知)要么不再受支持,要么使用命令行,或者必须检查文件(不是字符串)

我不需要完整的编译器或任何东西。 我只需要知道字符串是否是有效的PHP代码。

编辑:通过有效的php代码 ,我的意思是它可以执行,没有编译器/语法错误,并且应该仅包含PHP代码。 它可能有运行时错误,并且仍然有效,例如$y = 33/0; 它应该只包含PHP ...,例如<div>stuff</div><? echo "str"; ?> <div>stuff</div><? echo "str"; ?> <div>stuff</div><? echo "str"; ?>将无效,但<? echo "str"; ?> <? echo "str"; ?> <? echo "str"; ?>echo "$str"; 将是有效的

您可以将字符串传递给php -l并使用shell_exec进行调用:

$str1 = "<?php echo 'hello world';";
$str2 = "<?php echo 'hello world'";
echo isValidPHP($str1) ? "Valid" : "Invalid"; //Valid
echo isValidPHP($str2) ? "Valid" : "Invalid"; //Inalid

function isValidPHP($str) {
    return trim(shell_exec("echo " . escapeshellarg($str) . " | php -l")) == "No syntax errors detected in -";
}

只是有另一个想法...这次使用eval但安全:

test_code.php

$code = "return; " . $_GET['code'];
//eval is safe here because it won't do anything
//since the first thing we do is return
//but we still get parse errors if it's not valid
//If that happens, it will crash the whole script, 
//so we need it to be in a separate request
eval($code); 
return "1";

您代码中的其他位置:

echo isValidPHP("<?php echo \"It works!\";");

function isValidPHP($code) {
    $valid = file_get_contents("http://www.yoursite.com/test_code.php?" . http_build_query(['code' => $code]));
    return !!$valid;
}

离开我的头顶,这是最简单的。

$str = "<? echo 'abcd'; ?>";
file_put_contents("/some/temp/path", $str);
exec("php -l /some/temp/path", $output, $result);
if ($result == 0){
   echo "{$str} is valid";
} else {
   echo "{$str} is not valid PHP code";
}
unlink("/some/temp/path");

我不使用php_check_syntax的原因是:

  1. 不推荐使用
  2. 它实际上执行代码

编辑:只是看到您想避免使用exec()。 我认为,如果没有它,这将变得非常困难,php删除了check_syntax函数是有原因的。 也许(我真的只是在这里猜测,这涉及到您想要投入的精力)是在容器中运行php -l(最近几天是docker),并通过http调用将代码传递给docker守护进程(只是一个针对标准php cli运行命令将在此处执行)。 然后,您可以使用下面的代码示例,而无需担心(只要您不对容器obv授予任何权限)。

您可以像这样使用exec和php命令行:

$ret = exec( 'echo "<?php echo \"bla\";" | php -l 2> /dev/null' );

echo strpos( $ret, 'Errors parsing' ) !== false ? "\nerror" : "\nno error";

$ret = exec( 'echo "<?php eccho \"bla\";" | php -l 2> /dev/null' );

echo strpos( $ret, 'Errors parsing' ) !== false ? "\nerror" : "\nno error";

返回:

no error
error

由于对输出进行了管道传输,因此无需文件。 同样使用重定向到dev null,我们在其他地方也不会得到不需要的输出。 当然仍然有点脏,但是我能想出的最短。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM