2009-11-04 2 views
0

다른 디렉토리에서 텍스트 파일을 찾고 그 파일에 정규식을 실행하는 가장 효율적인 방법은 무엇입니까? 나는 PHP/스크립트를 로컬에서 실행할 것이다.PHP와 regex를 사용하여 디렉토리에서 파일을 찾은 다음 정규 표현식을 실행하십시오.

D : \ Script \ 여기서 D : \ Script \ folder_01, D : \ Script \ folder_02 등에서 스크립트를 실행하고 싶다고 가정 해 봅시다.이 스크립트에서 파일을 볼 스크립트를 원합니다. 이러한 폴더 이름은 논리적이 아니며 아무거나 될 수 있습니다.

그래서 모든 파일을 찾고 싶지는 않지만 "게임 유형 : xxxxx"줄이 포함 된 파일 만 찾으십시오. (일치하는 텍스트 파일 수는 약 150-200 개입니다)

그런 파일을 찾은 후에 한 번에 하나의 preg_replace 파일을 실행하고 싶습니다.

감사합니다.

+1

cygwin을 다운로드하고 대신 grep 및 sed를 사용하는 것으로 간주됩니까? –

답변

1

로컬로 실행하려는 경우 다른 언어를 사용하는 것이 더 빠르고 구현하기가 더 쉽습니다.

그럼에도 불구하고,이 PHP를 사용하려는 경우 :

  1. 가 반복적으로 아래로 특정 디렉토리에서 모든 파일의 목록을 확인하십시오. 그래서 그것은 D : \ scripts \ foo와 D : \ scripts \ foo \ bar 등일 수 있습니다 (재귀 함수, scandir() 등 사용).
  2. 파일별로 파일과 파일 이름을 찾은 전체 경로를 저장하십시오.
  3. 이제 배열 전체를 살펴보고 그 파일을 여는 함수를 호출하는 모든 파일에 대해 원하는 문자열의 모든 행에 대해 정규식을 수행하고 해당 문자열이 있으면 TRUE를 반환합니다. 함수가 TRUE를 반환하면 path + filename을 두 번째 배열에 저장합니다. 이제 원하는 문자열이 들어있는 모든 파일 목록을 얻었습니다.
  4. 파일을 열 때마다 함수를 호출하여 모든 행을 읽고 preg_replace()를 호출하여 만든 두 번째 배열을 탐색합니다.

특정 문자열을 찾은 모든 파일 목록이 필요없는 경우 3 단계와 4 단계를 하나로 접을 수 있습니다.

$fileList = giveFileList('D:\scripts\foo'); 
$selectedFileList = array(); 
for($i = 0 ; $i < count($fileList) ; $i++) 
{ 
    if(stringExistsInFile($fileList[$i])) 
    { 
     $selectedFileList[] = $fileList[$i];  
    } 
} 

for($i = 0 ; $i < count($selectedFileList) ; $i++) 
{ 
    replaceStringInFile($selectedFileList[$i]); 
} 
0

이 전체 트릭을 할 것입니다 : 코드에서

? 아니면 뭔가 중요한 것을 놓치고 있습니까? 죄송합니다. 저는 초보자입니다! :)

if ($handle = opendir('/scripts')) { 
    while (false !== ($filename = readdir($handle))) { 
     $openFile = fopen($filename, "r") or die("Can't open file"); 
     $file = fread($openFile, filesize($filename)); 
     $pattern = '/^Game Type: xxx$/im'; 
     if (preg_match($pattern, $file)) { 
     // preg_replace goes here 
     // fopen newFile goes here 
     // fwrite newFile goes here 
     // fclose newFile goes here 
     } 
     fclose($openFile); 
    } 

    closedir($handle); 
} 
관련 문제