PHP 从文件中提取代码

PHP Extract Code out of File

我有一个文件(在我的例子中是 debug.log),里面有很多来自许多文件的源代码。我想将这些代码行提取到单独的文件中。

我的debug.log结构:

#NewFile#path/to/file.php
<?php
class ClassA {
function A() { do smth(); }
}

#NewFile#path/to/nextFile.php
<?php
class ClassA {
function A() { do smth(); }
}

#NewFile#path/to/thirdFile.php
...

现在我想按#NewFile# 拆分并将内容保存在新的 .php 文件中。

这是我的代码:

$handle = fopen('debug.log', 'r');
$index = 1;
$filename = '/home/myuser/folder/file';

while (($line = fgets($handle)) !== false) {
    if (strpos($line, '#NewFile#') !== false) {
        $content = file_get_contents($filename . $index . '.php');
        file_put_contents($filename . $index . '.php', $content . $line);
    } else {
        $index++;
    }

}

fclose($handle);

感谢您的帮助:)

除了一个名为 debug.log 的文件似乎包含 PHP 源这一事实(无论你怎么看,它都非常奇怪),这是一件相当微不足道的事情:

可靠地解析 php php 中的文件,最简单的方法是使用the token_get_all function.在这种情况下,只需执行以下操作即可:

$tokens = token_get_all(file_get_contents('input_file.php'));
$file = null;
$contents = [];
foreach ($tokens as $token) {
    //comment with #NewFile# in there?
    if ($token[0] === T_COMMENT && strstr($token[1]{0}, '#NewFile#')) {
        if ($file) {
            //write code to file
            file_put_contents($file, implode(PHP_EOL, $contents));
        }
        $contents = ['<?php '];
        $file = str_replace('#NewFile#', '', $token[1]);//set file path
    } else {
        //use line numbers as key, append value of current token to the line
        $contents[$token[2]] .= $token[1];
    }
}
//write the last file
if ($file) {
    file_put_contents($file, implode(PHP_EOL, $contents));
}

我正在遍历所有解析器标记。如果我遇到包含字符串 #NewFile#T_COMMENT 标记,我将其视为我需要将当前缓冲区($contents 写入我上次从上一条评论中读取的文件中的标志。之后,我重新分配 $file 以指向一个新文件(同样,路径和名称取自评论),并再次开始构建 $contents 缓冲区。

循环后,$file$contents 将包含所有应该放在最后一个文件中的标记,所以我只是快速检查一下(确保 $file 已设置), 并将缓冲区中的任何内容写入该文件。

这是我自己的问题解决方案,已经解决了:)

$handle = fopen(dirname(__FILE__) . '/debug.log', 'r');
$fileName = '/file';
$dir = '/home/myuser/folder';

while (($line = fgets($handle)) !== false) {
    if (strpos($line, '#NewFile#') === false) {
        if (file_exists($dir . $fileName)) {
            file_put_contents($dir . $fileName, $line, FILE_APPEND);
        } else {
            preg_match("/(\/.*\/)/", $fileName, $path);
            if (!is_dir($dir . $path[0])) {
                mkdir($dir . $path[0], 0777, true);
            }
            file_put_contents($dir . $fileName, $line);
        }
    } else {
        $fileName = str_replace(".#NewFile#", '', $line);
        $fileName = str_replace("#NewFile#", '', $fileName);
    }

}

fclose($handle);