Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查字符串是否为有效的PHP代码_Php_Syntax Checking - Fatal编程技术网

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

检查字符串是否为有效的PHP代码,php,syntax-checking,Php,Syntax Checking,我想做: $str = "<? echo 'abcd'; ?>"; if (is_valid_php($str)){ echo "{$str} is valid"; } else { echo "{$str} is not valid PHP code"; } $str=”“; 如果(有效的php($str)){ 回显“{$str}有效”; }否则{ echo“{$str}不是有效的PHP代码”; } 是否有一种简单的方法来执行是否有效\u php检查 我所能找到的只

我想做:

$str = "<? echo 'abcd'; ?>";
if (is_valid_php($str)){
   echo "{$str} is valid";
} else {
   echo "{$str} is not valid PHP code";
}
$str=”“;
如果(有效的php($str)){
回显“{$str}有效”;
}否则{
echo“{$str}不是有效的PHP代码”;
}
是否有一种简单的方法来执行
是否有效\u php
检查

我所能找到的只是在线php语法检查器和检查语法的命令行方法,或者只对文件有效,我不想为了检查字符串是否有效而写入文件

我不想使用
system()
/
exec()
eval()

-这是旧的,所以我希望有新的东西

-所有选项(据我所知)要么不再受支持,要么使用命令行,要么必须检查文件(而不是字符串)

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


编辑:通过有效的php代码,我的意思是它可以执行,没有编译器/语法错误,并且应该只包含php代码。它可能有运行时错误并且仍然有效,比如
$y=33/0。它应该只包含PHP。。。例如,
stuff
将无效,但
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 -";
}
在代码的其他地方:

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;
}

echo isvalidppp(“您可以将字符串通过管道传输到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 -";
}
在代码的其他地方:

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;
}

echo是有效的HP(在我的头顶上,这是最简单的

$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");
$str=”“;
文件内容(“/some/temp/path”,$str);
exec(“php-l/some/temp/path”,$output,$result);
如果($result==0){
回显“{$str}有效”;
}否则{
echo“{$str}不是有效的PHP代码”;
}
取消链接(“/some/temp/path”);
我没有使用
php\u check\u语法的原因是:

  • 它已被弃用
  • 它实际上执行代码

  • 在我看来,这是最简单的

    $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");
    
    $str=”“;
    文件内容(“/some/temp/path”,$str);
    exec(“php-l/some/temp/path”,$output,$result);
    如果($result==0){
    回显“{$str}有效”;
    }否则{
    echo“{$str}不是有效的PHP代码”;
    }
    取消链接(“/some/temp/path”);
    
    我没有使用
    php\u check\u语法的原因是:

  • 它已被弃用
  • 它实际上执行代码

  • 编辑:刚刚看到您希望避免使用exec()。 我认为如果没有它,这将是非常困难的,php删除了check_语法函数是有原因的。 也许(我真的只是在这里猜测,当涉及到您想要投入的精力时)在容器中运行php-l(docker现在几乎都是如此)并通过http调用将代码传递给docker守护进程(这里只需对标准php cli执行run命令即可)。然后,您可以毫无顾虑地使用下面的代码示例(前提是您不授予容器obv任何权限)

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

    由于管道化的输出,不需要任何文件。通过重定向到dev null,我们在别处也不会得到不需要的输出。
    当然还是有点脏,但这是我能想到的最短版本。

    编辑:刚刚看到您希望避免使用exec()。 我认为如果没有它,这将是非常困难的,php删除了check_语法函数是有原因的。 也许(我真的只是在这里猜测,当涉及到您想要投入的精力时)在容器中运行php-l(docker现在几乎都是如此)并通过http调用将代码传递给docker守护进程(这里只需对标准php cli执行run命令即可)。然后,您可以毫无顾虑地使用下面的代码示例(前提是您不授予容器obv任何权限)

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

    由于管道化的输出,不需要任何文件。通过重定向到dev null,我们在别处也不会得到不需要的输出。
    当然还是有点脏,但这是我能想到的最短版本。

    向那些在线语法检查器发布curl请求怎么样?我不知道这些站点,所以我不确定是否可能,但你可以观察网络请求,看看是否可以用curl模拟。你能澄清一下“有效”吗?这是否意味着无编译时和运行时错误?或按预期工作?我所能找到的与您所做的相同。我检查了一个REST服务,但该服务也接受一个文件。写入(和删除)文件是一项非常简单的任务-所以我很好奇,为什么你不想用php_check_语法写入文件?@HPierce,我更新了我的问题来解释…php解析器或phc似乎是个不错的选择。@Jakar我知道检查字符串会更好,而写入和删除文件和内容只是一项愚蠢的冗余工作。Dependi如果您想检查代码多少次,写入文件不会轻易影响性能。如果我是您,我会在尝试其他操作之前立即开始写入文件,但这就是我:)向那些在线语法检查器发送curl请求怎么样?我不知道这些站点,所以我不确定这是否可能,但是你可以观察网络请求,看看是否可以用curl模拟它。你能澄清一下“有效”吗?这是否意味着无编译时和运行时错误?或按预期工作?我所能找到的与您所做的相同。我检查了一个REST服务,但该服务也接受一个文件。写入(和删除)文件是一项非常简单的任务-所以我很好奇,为什么你不想用php_check_语法写入文件?@HPierce,我更新了我的问题来解释…php解析器或phc似乎是个不错的选择。@Jakar我知道检查字符串会更好,而写入和删除文件和内容只是一项愚蠢的冗余工作。Dependi如果你想检查代码多少次,写入文件不会轻易影响性能