2016-08-22 4 views
1

나는 (내 경우에는 debug.log) 파일이 있고 거기에 많은 파일의 소스 코드가 많이 있습니다. 이 코드 줄을 별도의 파일로 추출하고 싶습니다. 내 debug.log를의PHP 추출 코드 파일에서

구조 :

#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 
... 

지금 내가 #이를 새 번호로 분할 할 새로운 .PHP 파일의 내용을 저장합니다.

이이 일을 내 코드입니다 : 당신의 도움 :) 파일이 debug.log는 PHP 소스를 (포함하는 것 같다라는 사실에서 별도로

+2

그래서 예상대로 작동하지 않는 것은 무엇입니까? – WillardSolutions

+0

로그 파일에 소스 코드가있는 이유는 무엇입니까? ... – War10ck

+0

년, 보안 취약점이 있습니다. 나는 충분한 정보 that thats라고 생각한다. ^^ – Ulfe

답변

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

에 대한

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

감사하는, 아무리 당신을 PHP는 01을 사용하는 것입니다에서 안정적으로 PHP 파일을 구문 분석

가장 간단한 방법 에 : 할 수있는 아주 사소한 일이) 정말 이상해, 그것을보고. 이 경우 다음과 같은 작업을 수행해야합니다.

$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이 설정되어 있는지 확인)하고 해당 파일의 버퍼에있는 내용을 모두 써 넣으십시오.