45

ディレクトリ内のすべてのCSVファイルが必要なので、

glob('my/dir/*.CSV')

ただし、これは小文字のCSV拡張子を持つファイルを検索しません。

使用できます

glob('my/dir/*.{CSV,csv}', GLOB_BRACE);

しかし、すべての混合ケースバージョンを許可する方法はありますか?それともこれは単なる制限glob()ですか?

4

10 に答える 10

65

グロブパターンは文字範囲をサポートします:

glob('my/dir/*.[cC][sS][vV]')
于 2010-03-26T01:37:22.830 に答える
43

あなたはこれを行うことができます

$files = glob('my/dir/*');

$csvFiles =  preg_grep('/\.csv$/i', $files);
于 2010-03-26T01:33:04.853 に答える
7

glob('my/dir/*.[cC][sS][vV]')それをする必要があります。ええ、それはちょっと醜いです。

于 2010-03-26T01:45:20.890 に答える
2

すべてのファイルを選択した後、ファイルを除外することもできます

foreach(glob('my/dir/*') as $file){
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    if(!in_array($ext, array('csv'))){
        continue;
    }
    ... do stuff ...
}

たとえば、フォルダにcsvではないファイルが100万個ある場合、パフォーマンスの面ではこれは最適なオプションではない可能性があります。

于 2014-10-08T12:15:06.783 に答える
1

このコードは、画像のみを取得し、大文字と小文字を区別しないようにするために機能します。

画像リスト:

  • image1.Jpg
  • image2.JPG
  • image3.jpg
  • image4.GIF
$imageOnly = '*.{[jJ][pP][gG],[jJ][pP][eE][gG],[pP][nN][gG],[gG][iI][fF]}';
$arr_files = (array) glob($path . $imageOnly, GLOB_BRACE);

見た目は醜いかもしれませんが、$ imageOnlyを宣言する必要があるのは1回だけで、必要な場所で使用できます。$jpgOnlyなどを宣言することもできます。

このパターンを作成する関数も作成しました。

/*--------------------------------------------------------------------------
 * create case insensitive patterns for glob or simular functions
 * ['jpg','gif'] as input
 * converted to: *.{[Jj][Pp][Gg],[Gg][Ii][Ff]}
 */
function globCaseInsensitivePattern($arr_extensions = []) {
   $opbouw = '';
   $comma = '';
   foreach ($arr_extensions as $ext) {
       $opbouw .= $comma;
       $comma = ',';
       foreach (str_split($ext) as $letter) {
           $opbouw .= '[' . strtoupper($letter) . strtolower($letter) . ']';
       }
   }
   if ($opbouw) {
       return '*.{' . $opbouw . '}';
   }
   // if no pattern given show all
   return '*';
} // end function

$arr_extensions = [
        'jpg',
        'jpeg',
        'png',
        'gif',
    ];
$imageOnly = globCaseInsensitivePattern($arr_extensions);
$arr_files = (array) glob($path . $imageOnly, GLOB_BRACE);
于 2018-12-15T21:47:52.040 に答える
0

大文字と小文字を区別しない独自のグロブを作成できます。これは私が書いた個人のウェブライブラリからのものです:

/** PHP has no case insensitive globbing
 * so we have to build our own.
 *
 * $base will be the initial part of the path which doesn't need case insensitive
 * globbing.
 * Suffix is similar - it will not be made insensitive
 * Make good use of $base and $suffix to keep $pat simple and fast in use.
 */
    function ciGlob($pat, $base = '', $suffix = '')
    {
        $p = $base;
        for($x=0; $x<strlen($pat); $x++)
        {
            $c = substr($pat, $x, 1);
            if( preg_match("/[^A-Za-z]/", $c) )
            {
                $p .= $c;
                continue;
            }
            $a = strtolower($c);
            $b = strtoupper($c);
            $p .= "[{$a}{$b}]";
        }
        $p .= $suffix;
        return glob($p);
    }
于 2014-02-13T09:54:09.383 に答える
0

このように使える関数について聞いたことがあります:それがあなたのために働くかどうか試してみてください!

<?php
$pattern = sql_regcase("*.txt");
glob($pattern);
?>
于 2015-03-30T23:35:38.097 に答える
0

複数のファイルがあるglobについては、このリンクにアクセスしてください。OPには役立ちませんが、ここにたどり着く他の人には役立つ可能性があります。

$file_type = 'csv,jpeg,gif,png,jpg';
$i = '0';
foreach(explode(",",$file_type) as $row){
    if ($i == '0') {
        $file_types = $row.','.strtoupper($row);
    } else {
        $file_types .= ','.$row.','.strtoupper($row);
    }
    $i++;
}

$files = glob($dir."*.{".$image_types."}",GLOB_BRACE);
于 2018-03-02T18:57:55.107 に答える
0

Alexのヒントに基づいて、これは一般的に役立つ可能性があります。

function glob_files ($d, $e)
{
    $files = preg_grep ("/$e\$/i", glob ("$d/*"));
    sort ($files)
    return $files;
}

ここ$dで、はディレクトリで、$eは拡張子です。

于 2019-07-13T21:34:52.833 に答える
-1

すべての拡張機能で機能させるには、次を使用します。

$extension = 'some_extension';
glob('my/dir/*.preg_replace('/(\w)/e', "'['.strtoupper($1).strtolower($1).']'", $extension));
于 2017-03-04T00:58:21.517 に答える