2009-07-10 28 views
1

這很簡單, 但我服用一個完整的目錄列表(PHP中dir()),並確保它都「」我怎樣才能確保一件事情匹配,而一件事情沒有,在一個正則表達式?

  • 不或「..」,
  • 以文件擴展名.jpg,.jpeg,.gif或.png結尾。

現在我有

function isValidFile($filename) { 
    $dirDotExpr = "/^\.{1,2}$/"; //matches against "." and ".." 
    $extExpr = "/\.(jpg|jpeg|gif|png)$/i"; //checks file extension 

    return (1 
     && ! preg_match($dirDotExpr, $filename) 
     && preg_match($extExpr, $filename) 
    ) 
} 

,但它會是不錯的做這一切在一個正則表達式。但是,我不知道如何確定一件事情是否匹配,並且有一件事情不是 - 我該如何做到這一點?

+0

在附註上,關於單個正則表達式的問題,請注意將所有邏輯放入一個正則表達式通常不是最佳解決方案。它可能會傷害可讀性和速度。 – Geert 2009-07-10 08:50:47

回答

6

您可能正在反思。如果您驗證$filename以.jpg,.jpeg,.gif或.png結尾,則顯然不能是「。」。要麼 」..」。

+0

你是對的,謝謝。 我想這是因爲我最初只是想擺脫。和..,但後來認爲我應該確保文件是正確的類型,因爲我不會是維護目錄的人。 – 2009-07-10 00:52:33

0

如果你不想讓你的文件名期間(除名和擴展名的分隔符):^ [^ \ X2E] + \ X2E(JPG | JPEG | GIF | PNG)$

如果你允許週期(多部分名稱):^([^ \ X2E] + \ X2E)+(JPG | JPEG | GIF | PNG)$

轉換爲需要PHP ...

1
function isValidFile($filename) 
{ 
    return (bool) preg_match('/\.(?:jpe?g|gif|png)$/iD', (string) $filename); 
} 

請注意,我做了括號不捕獲,爲小幅度提高速度。還將jpgjpeg合併爲jpe?g。另外,我添加了D修飾符。如果你不這樣做,$將允許最後換行;像「hello.jpg \ n」這樣的文件名將被認爲是有效的。非常瞭解這一點。

相關問題