编辑目录中所有 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
我正在尝试制作一个脚本来查看特定目录,打开该目录中的所有 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