编辑目录中所有 ZIP 文件中的所有文件(查找 + 替换)

Edit all Files in all ZIP Files in a Directory (Find + Replace)

我正在尝试制作一个脚本来查看特定目录,打开该目录中的所有 zip 文件,查找并替换我在所有 ZIP 文件中的所有文件中分配的变量,然后 close/re-zip他们。

通常,zip 中的文件类型为 .htm、.html、.php 和 .txt。

到目前为止,我已经到了这里...

$zip = new ZipArchive;
$zip->open('testzip.zip'); 

for ($i = 0; $i < $zip->numFiles; $i++) {
$filename = $zip->getNameIndex($i);
// ...

$oldContents = $zip->getFromName($filename);
//Modify contents:
$newContents = str_replace('#topofpage', '#', $oldContents);
//Delete the old...
$zip->deleteName($filename);
//Write the new...
$zip->addFromString($filename, $newContents);
//And write back to the filesystem.
$zip->close();
}

即使我 print_r ZIP 中的所有文件都正确列出,脚本也只会替换 zip 中的一个文件。每次刷新都会替换不同的文件。

当然这也只适用于指定的一个特定 ZIP。我希望脚本获取目录中的所有 Zip 文件,并替换所有 Zip 文件中的所有文件中的文本。

查找变量 = #topofpage

替换变量=#

感谢您的帮助!

我会这样做:

$dir_array = scandir ( $path_to_zip_dir );
for($i = 0; $i<sizeof($dir_array); $i++) {
  if(substr($dir_array[$i],strlen($dir_array[$i])-4) == ".zip") {
    mkdir($path_to_zip_dir."temp");
    $zip = new ZipArchive;
    $res = $zip->open($path_to_zip_dir.$dir_array[$i]); 
    if ($res === TRUE) {
      $zip->extractTo($path_to_zip_dir."temp/");
      $zip->close();
      $temp_dir_files_array = scandir ($path_to_zip_dir."temp/");
      for($j=0; $j<sizeof($temp_dir_files_array); $j++) {
        $fh = fopen($temp_dir_files_array[$j],'r');
        $file_text = "";
          while ($line = fgets($fh)) {
            //Gets read by line and you can switch out what you need
            str_replace($what_you_are_looking_for,$what_you_replace_with, $line);
            $file_text = $line;
          }
        fclose($fh);
        unlink($temp_dir_files_array[$j]);
        $fh = fopen($temp_dir_files_array[$j],'w');
        fwrite($fh,$file_text);
        fclose($fh);

      }
    }
  }

      //Now repack the zip and delete the tempdirectory
      ...  
}

我发现为了让它工作,我需要在任何循环之前获取存档中的文件数 - 否则计数会随着循环 运行 不断增加,因此 zip 中的文件数会增加.

考虑到这个微小的变化,以下内容似乎可以正常运行。

以下内容基于当前脚本目录中名为 zips 的目录,其中包含任意数量的 zip 存档文件。

$search='absent';
$replace=' --BRIGHT YELLOW HIPPOPOTAMUS-- ';



function modifyzip($archive,$search,$replace){
    $zip = new ZipArchive();
    $status = $zip->open( $archive );

    if( $status == true ){
        /* Get the count of files BEFORE the loop */
        $filecount = $zip->numFiles;

        for( $i=0; $i < $filecount; $i++ ){
            $name = $zip->getNameIndex( $i );
            $content = $zip->getFromName( $name );
            $edited = str_replace( $search, $replace, $content );
            $zip->deleteName( $name );
            $zip->addFromString( $name, $edited );
        }   
    }
    $zip->close();  
}

$dir=__DIR__ . '/zips/';
$col=glob( $dir . '*.zip' );
if( $col && count( $col ) > 0 ){
    foreach( $col as $archive ){
        call_user_func( 'modifyzip',$archive,$search,$replace );
    }
}

用于测试的 zip 文件包含一个 wordlist` 文件 - 处理后的内容类似于以下内容 - 但 运行 几千行)

abnormal
abnormality
 --BRIGHT YELLOW HIPPOPOTAMUS-- 
absolute
absolve
absorption
abstain
abstraction
abused
abusive
accelerated
accepted