2016-08-22 4 views
1

Ich habe eine Datei (in meinem Fall debug.log) und es gibt eine Menge Quellcode aus vielen Dateien darin. Ich möchte diese Codezeilen in separaten Dateien extrahieren.PHP Extract Code aus Datei

Struktur meiner 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 
... 

Jetzt möchte ich von # NewFile # und teilen möchten den Inhalt in einem neuen .php Datei speichern.

Dies ist mein Code, dies zu tun:

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

Vielen Dank für Ihre Hilfe :)

+2

Also was funktioniert nicht wie erwartet? – WillardSolutions

+0

Warum sollte in einer Protokolldatei ein Quellcode enthalten sein? ... – War10ck

+0

Jahr, nun, es ist eine Art Sicherheitsfehler. Ich denke, das ist genug Information ^^ – Ulfe

Antwort

0

Hier ist meine eigene Lösung für mein Problem, die es gelöst hat :)

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

Abgesehen von der Tatsache, dass eine Datei namens debug.log PHP Quelle zu enthalten scheint (was, ganz gleich, wie Sie betrachten es ist wirklich seltsam), ist es eine ziemlich triviale Sache zu tun ist:

Der einfachste Weg, um zuverlässig pHP-Dateien analysieren in pHP ist 01 zu verwenden,. In diesem Fall ist es eine Sache, so etwas zu tun:

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

Ich bin über alle Parser-Token iterieren. Wenn ich ein T_COMMENT Token mit der Zeichenfolge #NewFile# erhalte, nehme ich das als Zeichen, dass ich meinen aktuellen Puffer ($contents) in die Datei schreiben muss, die ich zuletzt aus dem vorherigen Kommentar gelesen habe. Danach weise ich $file zu, um auf eine neue Datei zu zeigen (auch hier Pfad und Namen aus dem Kommentar genommen), und starten Sie den Aufbau der $contents Puffer wieder.

Nach der Schleife, $file und $contents werden alle Token enthalten, die in der letzten Datei gehen sollte, so dass ich nur eine schnelle check (vergewissere dich, dass $file gesetzt ist), und schreibe, was auch immer im Puffer zu dieser Datei ist.