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

Ree*_*eed 1 php syntax-checking

我想要做:

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

有没有简单的方法来is_valid_php检查?

我能找到的只是在线php语法检查程序和命令行方法来检查语法,或者php_check_syntax只适用于文件,我不想写入文件来检查字符串是否有效.

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

相关问题 - 它已经过时了,所以我希望有新的东西

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

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

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

dav*_*ave 5

您可以将字符串传递给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 -";
}
Run Code Online (Sandbox Code Playgroud)

只是有了另一个想法...这次使用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";
Run Code Online (Sandbox Code Playgroud)

你代码中的其他地方:

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;
}
Run Code Online (Sandbox Code Playgroud)