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