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";有效
您可以将字符串传递给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)