PHP从文件中提取代码

时间:2016-08-22 13:16:24

标签: php file-get-contents

我有一个文件(在我的例子中是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);

感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

除了名为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));
}

我正在遍历所有解析器令牌。如果我遇到包含字符串T_COMMENT的{​​{1}}令牌,我会将其视为我需要将当前缓冲区(#NewFile#)写入我上次从上一条评论中读取的文件中的符号。之后,我重新分配$contents指向一个新文件(再次,从注释中获取路径和名称),然后再次开始构建$file缓冲区。

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

答案 1 :(得分:0)

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

$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);