PHP正则表达式忽略以双__underscore开头的文件

sun*_*100 3 php regex preg-match

我试过了,但我根本无法用PHP包围正则表达式.我需要一个执行以下操作的正则表达式:

  • 忽略以双__underscore开头的文件.(例如__file.jpg)
  • 忽略以"thumb"结尾的文件.(例如somethumb.jpg或thumb.jpg)
  • 忽略所有文件类型,但gif | jpg | png | jpeg

我现在有以下内容,它似乎满足#2和#3,但不是#1:

preg_match(/(?<!thumb)\.(gif|jpg|png|jpeg)$/i, $file)
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢!

roc*_*987 5

如果我正确理解第三点,则意味着它应该以所有这些文件扩展名结束.考虑到这一点,以下将起作用

第一解决方案

(?!^__|.*thumb\.(gif|jpg|png|jpeg))(^.*)(?=\.(gif|jpg|png|jpeg)$)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

迈向有效的解决方案

第二解决方案

^(?!__|.*thumb\.(?:gif|jpg|png|jpeg))(.*(?=\.(?:gif|jpg|png|jpeg)$).*$)
Run Code Online (Sandbox Code Playgroud)

第3个解决方案(由Wiktor在评论中提出)

^(?!__|.*thumb\.(?:gif|jpg|png|jpeg))(?=.*\.(?:gif|jpg|png|jpeg)$).*
Run Code Online (Sandbox Code Playgroud)

第四解决方案(Casimir在评论中提出)

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

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);
Run Code Online (Sandbox Code Playgroud)

Ideone演示

  • 或者`^(?!__ |.*thumb \.)(?=.*\.(?:gif | jpg | png | jpeg)$).*` (2认同)
  • 最初的外观是一个好主意.我会写这个:https://regex101.com/r/yF5vP8/1或者说:https://regex101.com/r/yF5vP8/2 (2认同)