Ever wanted to search and replace inside a zip container with PHP?
# this will replace every 'a' by 'A' inside every html file inside file.zip replaceinzip("file.zip", '/a/', 'A', "/.+?html/"); exit(); function replaceinzip($zipfile, $search, $replace, $filefilter) { # extract to random temp folder $tempfolder=md5(mt_rand()); $zip = new ZipArchive; if ($zip->open($zipfile) === TRUE) { $zip->extractTo('./'.$tempfolder.'/'); $zip->close(); } else { trigger_error(htmlentities("not a zip error"), E_USER_ERROR); } # replace in files $files=rsearch($tempfolder, $filefilter); foreach ($files as $file) { $file_content = file_get_contents($file); $file_content = preg_replace($search, $replace, $file_content); file_put_contents($file,$file_content); } # create new temp zip $zip = new ZipArchive(); if($zip->open($zipfile.'_temp', ZIPARCHIVE::OVERWRITE) !== true) { return false; } # add files to new temp zip without foldername $files=rsearch($tempfolder, "/.*/"); # add mimetype first to overcome epub checking errors $zip->addFile($tempfolder.'/mimetype', "mimetype"); foreach($files as $file) { $zip_filename = substr($file, strpos($file,'/') + 1); if (file_exists($file) && is_file($file) && $zip_filename!="mimetype") $zip->addFile($file, $zip_filename); } $zip->close(); # rename new zip to old zip rename($zipfile.'_temp', $zipfile); # remove temp folder and files delete($tempfolder); return true; } # http://stackoverflow.com/questions/17160696/php-glob-scan-in-subfolders-for-a-file#17161106 function rsearch($folder, $pattern) { $dir = new RecursiveDirectoryIterator($folder); $ite = new RecursiveIteratorIterator($dir); $files = new RegexIterator($ite, $pattern, RegexIterator::GET_MATCH); $fileList = array(); foreach($files as $file) { $fileList = array_merge($fileList, $file); } return $fileList; } #http://stackoverflow.com/questions/1334398/how-to-delete-a-folder-with-contents-using-php/1334425#1334425 function delete($path) { if (is_dir($path) === true) { $files = array_diff(scandir($path), array('.', '..')); foreach ($files as $file) { delete(realpath($path) . '/' . $file); } return rmdir($path); } else if (is_file($path) === true) { return unlink($path); } return false; }