2010-12-15 21 views
3

一致する複数のファイルのfnmatchと拡張子()一般的なファイルのマッチングコードで

while (false !== ($file = readdir($handle))) { 
    if ($file !== "." && $file !== ".." && fnmatch($mask, $file)) { 
     $dirList[] = $file; 
    } 
} 

私はこのような複数のファイル拡張子パターンを使用しようとしていた。

$mask = "*.{jpg,png,gif}"; 

を、それはしていません作業。ファイルは一致しません。同じパターンが端末でうまく動作するので、これはむしろ奇妙です。また、glob()で完全にうまく動作し、必要なファイルを返します。マスクとして "* .jpg"を使用すると、fnmatchでも動作するので、コードの残りの部分には何も問題はないことが分かります。 fnmatchがシェルで利用可能な同じパターンをサポートするとは思われませんでしたか?

答えて

4

サポートされていません。

AFAIK *.{ext,alt}は、シェルグロブのkshおよびbash拡張です。そして​​はシステムの機能ですが、機能はUnixの亜種によって異なります(BSDの場合はLinux/glibcのように見えません)。私が{alt}を働かせることができると確信しているFNM_EXTMATCH定数が存在します。しかし、PHPはそれをサポートしていない/それを渡す。

ただし、.{jpeg,png,gif}の一致をサポートするGLOB_BRACEオプションを使用すると、​​3210を使用できます。これであなたは自分自身をreaddir()に保存します。

+0

*(svn)* [file.c](http://svn.php.net/viewvc/php/php-src/trunk/ext/standard/file.c?view=markup) - 誰のためにそれがどのように実装されているかを見たい – Gordon

+0

興味深い。理論的には、libcが_EXTMATCHをサポートしていれば '0x20'を渡すことができます。 – mario

+0

ありがとうございます。あなたが示唆したように、glob()を使用することを選択しました。これは、必要なものをサポートしているからです。 PHPの将来のバージョンでは、FNM_EXTMATCH定数を使ってサポートされるでしょう。 – devius

0

あなたの中かっこの表記法は、私がbashで作業することを期待していますが、fnmatch()コールも私のために失敗します(角カッコの提案と同じです)。 php.netのこの関数(その定義の下)のwindows互換性に関する議論を見ると、中括弧の表記法は関数の正規表現の実装には考慮されていないことがわかります。

+0

中かっこ表記は、bashとglob()では機能しますが、fnmatch()では機能しません。角括弧は、3文字の文字グループではなく、個々の文字とのマッチングに使用されます。これはすでにphp.netのfnmatch()のexamplesセクションに示されています。私は窓の議論、感謝を見てみましょう。 – devius

関連する問題