[英]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
的原因是:
编辑:只是看到您想避免使用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.