Search code examples
phpregexpreg-match

PHP regex ignore files that start with double __underscore


I have tried, but I simply can't wrap my head around regex in PHP. I need a regex that does the following:

  • ignores files that start with double __underscore. (for example __file.jpg)
  • ignores files that end with "thumb". (for example somethumb.jpg or thumb.jpg)
  • ignores all file types but gif|jpg|png|jpeg

I have the following for now, which seems to fulfill #2 and #3, but not #1:

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

Any help much appreciated!


Solution

  • If I understood third point correctly it means that it should end with all these file extensions. Considering this, the following will work

    1st Solution

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

    Regex Demo

    Towards an efficient solution

    2nd Solution

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

    3rd Solution (suggested by Wiktor in comments)

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

    4th Solution (suggested by Casimir in comments)

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

    PHP Code

    $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