2016-04-21 37 views
3

我已經嘗試過了,但我根本無法在PHP中將我的頭圍繞正則表達式。我需要一個正則表達式執行以下操作:PHP的正則表達式忽略以雙__underscore開頭的文件

  • 忽略以雙__underscore開頭的文件。 (例如__file.jpg)
  • 忽略以「thumb」結尾的文件。 (例如somethumb.jpg或thumb.jpg)
  • 忽略所有的文件類型,但GIF | JPG | PNG | JPEG

我見現在以下,這似乎符合#2,#3 ,但不是#1:

preg_match(/(?<!thumb)\.(gif|jpg|png|jpeg)$/i, $file) 

任何幫助非常感謝!

回答

5

如果我正確理解第三點意味着它應該以所有這些文件擴展名結束。考慮到這一點,下面的工作

1解決方案

(?!^__|.*thumb\.(gif|jpg|png|jpeg))(^.*)(?=\.(gif|jpg|png|jpeg)$) 

Regex Demo

建立一個有效的解決方案

第二個解決方案

^(?!__|.*thumb\.(?:gif|jpg|png|jpeg))(.*(?=\.(?:gif|jpg|png|jpeg)$).*$) 

3解決方案(在評論由Wiktor建議)

第四方案(在評論由Casimir建議)

^(?!__)(?:[^.\n]*\.)*+(?<!thumb\.)(?:jpe?g|png|gif)$ 

PHP代碼

$re = "/^(?!__|.*thumb\\.(?:gif|jpg|png|jpeg))(?=.*\\.(?:gif|jpg|png|jpeg)$)(.*)/m"; 
$str = "__abcd.jpg\nthumbabcd.gif\nthumbabcdthumb.jpg\nthumbs.jpg\nsomethumb.jpg\nthumb.jpg\nabcd.jpg\nabcd.jps"; 

preg_match_all($re, $str, $matches); 

Ideone Demo

+2

或'^(?!__ |。* thumb \。)(?=。* \。(?: gif | jpg | png | jpeg)$)。*' –

+0

@WiktorStribiżewand you come up with an高效的解決方案..我剛剛接近 – rock321987

+1

它基本上是一樣的。只需避免在泛型子模式之前錨定未來的不必要的回溯。 –

0

這可能是一種矯枉過正,但你可以想出一些子程序一個更好的可讀性:

(?(DEFINE) 
    # condition1 
    (?<condition1>(?!(?:^__))) 
    # condition2 
    (?<condition2>(?!.*thumb)) 
    # allowed extensions 
    (?<ext>\.(?:gif|png|jpe?g)$) 
) 
^(?&condition1)(?&condition2).+(?&ext)$ 

a demo on regex101.com