我有一个文件(在我的例子中是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);
感谢您的帮助:)
答案 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);