我认为我可以方便地使用glob模式列出zip文件中的任何内容。但这似乎并不奏效。有办法吗?
<?php
$contents = glob('zip://path/to/archive.zip#subdir/*.ext');
var_dump($contents);
zip://流包装器似乎根本没有返回目录内容。
scandir('zip://path/to/archive.zip#subdir/'); // array(0){}
文档不是很有帮助:https://www.php.net/manual/en/wrappers.compression.php
这里有很多问题。Glob()不支持流包装器。并且zip://的流包装器没有列出目录内容的实现。
所以流包装器和glob()实现都需要替换。
更方便的方法是编写一个函数,从ZIPArchive()中提取数据。对象并使用fnmatch()进行筛选:function globzip($archive, $pattern, $flags = 0) {
$zip = new ZipArchive();
$zip->open($archive, ZipArchive::RDONLY);
$results = [];
for ($i = 0; $i < $zip->numFiles; $i++) {
$file = $zip->getNameIndex($i);
if (fnmatch($pattern, $file, $flags)) {
$results[] = $file;
}
}
return $results;
}
可以这样使用:
$files = globzip('/path/to/.zip', 'subdirectory/*.ext'));
https://www.php.net/manual/en/function.fnmatch.phphttps://www.php.net/manual/en/class.ziparchive