2016-04-21 61 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