Nasıl emin olabilirsiniz tek şey maçları, ve bir tek regex, değil mi?

3 Cevap php

This is simple, but I am taking an entire directory listing (in PHP with dir()), and making sure it both:

  • değil "." veya ".." ve
  • Bir dosya uzantısı. jpg,. jpeg,. gif veya. png biter.

Şu anda var

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)
    )
}

ama bir normal ifadede her şeyi güzel olurdu. Ancak, kesin bir şey maçları yapmak için nasıl bilmiyorum, ve doesnt bir şey - bunu nasıl başarabilirsiniz?

3 Cevap

Bunu overthinking olabilir. Eğer $filename. Jpg,. Jpeg,. Gif veya. Png biter doğrulayarak ediyorsanız, açıkça olamaz "." veya "..".

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

Ben küçük bir hız artışı için parantez olmayan yakalama, yapılan unutmayın. Ayrıca, birleştirilmiş jpg ve jpeg halinde jpe?g. Ayrıca, ben D değiştirici ekledi. Bunu yapmazsanız, $ son satırsonlarını sağlayacak; "hello.jpg \ n" gibi bir dosya adı geçerli kabul edilecektir. Bunun çok farkında olun.

Eğer (adı ve uzantısı sınırlayıcı hariç) dosya adını dönemleri izin vermek istemiyorsanız: ^ [^ \ x2E] + \ x2E (jpg | jpeg | gif | png) $

Eğer dönemleri (multi-part adı) izin verirseniz: ^ ([^ \ x2E] + \ x2E) + (jpg | jpeg | gif | png) $

Gerektiği gibi PHP dönüştürmek ...