13

私はこれができることを知っています...

glob('/dir/somewhere/*.zip');

... で終わるすべてのファイルを取得するには、しかし、 ZIPではない.zipすべてのファイルを返す方法はありますか?

それとも、その拡張子を持つものを繰り返し処理して除外する必要がありますか?

4

5 に答える 5

27

いつでも次のようなことを試すことができます。

$all = glob('/dir/somewhere/*.*');
$zip = glob('/dir/somewhere/*.zip');
$remaining = array_diff($all, $zip);

ただし、パスカルが言及した他の方法のいずれかを使用する方が効率的かもしれません。

于 2009-12-09T23:09:19.190 に答える
17

簡単な方法は、glob()for everything を使用preg_grep()して、不要なファイルを除外することです。

preg_grep('#\.zip$#', glob('/dir/somewhere/*'), PREG_GREP_INVERT)

PHP でのファイル マッチングの Glob パターンも参照してください。

于 2012-04-06T19:16:47.907 に答える
9

このパターンは機能します:

glob('/dir/somewhere/*.{?,??,[!z][!i][!p]*}', GLOB_BRACE);

/dir/somewhere/ 内のすべてを検索し、ドットで終わり、その後にいずれかが続きます

  • 1文字 ( ?)
  • または 2 文字 ( ??)
  • または、連続する文字 z、i、p ( [!z][!i][!p]*)で始まらないもの
于 2012-11-07T15:50:15.237 に答える
8

私は glob が「非ワイルドカード」を実行できるとは思わない...

他に少なくとも 2 つの解決策があります。

  • opendir/ readdir/の組み合わせを使用するclosedir
  • または、 SPL Iterator を使用します。より具体的には、私は考えていDirectoryIteratorます; 多分あなたはそれをいくつかと組み合わせることができますかFilterIterator
于 2009-12-09T23:04:49.820 に答える
0
$dir = "/path";
if (is_dir($dir)) {
    if ($d = opendir($dir)) {
           while (($file = readdir($d)) !== false) {
                if ( substr($file, -3, 3) != "zip" ){
                    echo "filename: $file \n";
                }
           }
        closedir($d);
    }
}

注: "." と「..」は気にしません。OPが完了するまで放置

于 2009-12-10T04:48:06.883 に答える