是否可以使用glob模式来匹配zip内容?



我认为我可以方便地使用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

相关内容

  • 没有找到相关文章

最新更新