2010-12-15 12 views
3

In der typischen Codedatei Matching:passende mehrere Dateierweiterungen mit fnmatch()

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

Ich habe versucht, eine multiple Dateierweiterung Muster wie folgt zu verwenden:

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

aber es funktioniert nicht Arbeit. Keine Dateien stimmen überein. Das ist ziemlich seltsam, da das gleiche Muster in einem Terminal gut funktioniert. Es funktioniert auch perfekt mit glob() und gibt die Dateien zurück, die ich möchte. Ich weiß, dass mit dem Rest des Codes nichts falsch ist, weil die Verwendung von "* .jpg" als Maske auch mit fnmatch funktioniert. Sollte fnmatch nicht die gleichen Muster unterstützen, die in einer Shell zur Verfügung stehen?

Antwort

4

Es wird nicht unterstützt.

AFAIK die *.{ext,alt} ist eine ksh- und bash-Erweiterung für Shell-Globs. Und fnmatch() ist eine Systemfunktion, aber die Funktionalität variiert zwischen Unix-Varianten (BSD hat es, Linux/Glibc scheint es nicht). Es gibt eine FNM_EXTMATCH Konstante, die {alt} funktionieren würde. Aber PHP unterstützt es nicht/gib es weiter.

Aber Sie könnten einfach glob() mit der GLOB_BRACE Option verwenden, die diese .{jpeg,png,gif} Übereinstimmung unterstützt. Und dadurch sparen Sie sich einen readdir().

+0

* (svn) * [file.c] (http://svn.php.net/viewvc/php/php-src/trunk/ext/standard/file.c?view=markup) - für diejenigen, die möchte sehen, wie es umgesetzt wird – Gordon

+0

Interessant. Theoretisch könnten Sie '0x20' durchreichen, wenn Ihre libc _EXTMATCH unterstützt. – mario

+0

Danke. Ich habe mich dafür entschieden, stattdessen glob() zu verwenden, wie Sie vorgeschlagen haben, da das unterstützt, was ich brauche. Vielleicht wird dies in einer zukünftigen Version von PHP über diese FNM_EXTMATCH-Konstante unterstützt. – devius

0

Ihre geschweifte Klammernschreibweise ist, was ich erwarten würde, auf bash zu arbeiten, aber der fnmatch() Anruf scheitert auch für mich (wie der eckige Klammervorschlag). Wenn Sie sich die Diskussion über die Windows-Kompatibilität für diese Funktion (unter ihrer Definition) bei php.net ansehen, werden Sie sehen, dass die geschweifte Klammernotation für die Regex-Implementierung der Funktion nicht berücksichtigt wird.

+0

Die geschweifte Klammernnotation funktioniert auf bash und glob(), nur nicht auf fnmatch(). Die eckige Klammer wird verwendet, um nur einzelne Zeichen und nicht drei Buchstabenzeichengruppen zu finden, und das ist bereits im Beispielabschnitt von fnmatch() auf php.net gezeigt. Ich werde mir die Windows-Diskussion ansehen, danke. – devius