2010-12-15 173 views
3

在典型的文件匹配代碼:匹配多個文件擴展名()

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

我試圖用這樣的多個文件擴展模式:

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

,但它不工作。沒有文件匹配。這很奇怪,因爲相同的模式在終端中工作得很好。它也適用於glob(),並返回我想要的文件。我知道其餘代碼沒有問題,因爲使用「* .jpg」作爲掩碼也適用於fnmatch。不是fnmatch應該支持shell中可用的相同模式嗎?

回答

4

不支持。

AFAIK *.{ext,alt}是殼層球的ksh和bash擴展。而​​是一個系統函數,但功能因Unix變體而異(BSD有它,Linux/glibc似乎沒有)。有一個FNM_EXTMATCH常數,我相信這將允許{alt}工作。但PHP不支持/傳遞它。

但是,您可以使用​​3210與GLOB_BRACE選項,該選項支持所說的.{jpeg,png,gif}匹配。通過這個,你會爲自己節省一個readdir()。

+0

*(svn)* [file.c](http://svn.php.net/viewvc/php/php-src/trunk/ext/standard/file.c?view=markup) - 對於那些誰想看看它是如何實施的 – Gordon 2010-12-15 17:43:32

+0

有趣。理論上講,如果你的libc支持_EXTMATCH,你可以通過'0x20'。 – mario 2010-12-15 17:47:43

+0

謝謝。正如你所建議的那樣,我選擇使用glob(),因爲它支持我需要的東西。也許在未來的PHP版本中,這將通過FNM_EXTMATCH常量來支持。 – devius 2010-12-15 18:26:02

0

您的大括號表示法是我期望在bash上工作的,但fnmatch()調用也會失敗(就像方括號中的提示一樣)。如果您在php.net上查看有關此函數(在其定義下)的窗口兼容性的討論,您會看到,大括號表示法不被用於該函數的正則表達式實現。

+0

大括號表示法對bash和glob()不起作用,只是不在fnmatch()上。方括號用於僅匹配單個字符而不是三個字母字符組,並且已經在php.net上的fnmatch()的示例部分中顯示。我會看看那個窗口的討論,謝謝。 – devius 2010-12-15 18:17:01

相關問題