Düzenli ifadeler ile PHP dosya uzantıları için denetleme

5 Cevap php

Ben tek bir dizindeki tüm dosyaları okuyorum ve JPG, JPEG, GIF ve PNG filtrelemek istiyorum.

Büyük ve küçük harfler de. Bunlar kabul edilecek tek dosyalardır.

Şu anda bu kullanıyorum:

$testPics = takeFiles($picsDir, "([^\s]+(?=\.(jpg|JPG|jpeg|JPEG|png|PNG|gif|GIF))\.\2)");

ve fonksiyon takeFiles bu gibi görünüyor:

function takerFiles($dir, $rex="") {
    $dir .= "/";
    $files = array();
    $dp = opendir($dir);
    while ($file = readdir($dp)) {
      if ($file == '.')  continue;
      if ($file == '..') continue;
      if (is_dir($file)) continue;
      if ($rex!="" && !preg_match($rex, $file)) continue;
      $files[] = $file;
    }
    closedir($dp);
    return $files;
  }

Ve her zaman hiçbir şey döndürür. Yani bir şey benim regex koduyla yanlış olmalıdır.

5 Cevap

Ben bir şey regex yanlış olduğunu düşünüyorum. Burada Regexes test deneyin ilk: http://www.spaweditor.com/scripts/regex/index.php

Ben bu sizin için işe yarayabilecek düşünüyorum:

/^.*\.(jpg|jpeg|png|gif)$/i

Sonunda / i Not - Bu "harf duyarsız" bayrak, tüm permütasyon yazın dışarı zorunda kaydeder :)

Nasıl glob() yerine kullanarak dersiniz?

$files = glob($dir . '*.{jpg,gif,png,jpeg}',GLOB_BRACE);

Eğer ScanDir kullanmak ve pathinfo istemediğiniz herhangi bir neden var mı?

public function scanForFiles($path, array $exts)
{
    $files = scanDir($path);
$return = array();

foreach($files as $file)
{
  if($file != '.' && $file != '..')
  {
    if(in_array(pathinfo($file, PATHINFO_EXTENSION), $exts))) {
          $return[] = $file;   
        }
  }
}

    return $return;
}

Üzgünüm, çok güzel biçimlendirilmiş değil. Yani aynı dosyanın bir dizin olup olmadığını kontrol edin ve bu dizini taramak için yinelemeli çağrı yapabilirdi. Ben acele kod yüzden% 100 doğru olmayabilir yazdı.

Eğer regexp etrafında eğik çizgi koymak gerekir. -> "/ (...) /"

Bunu yapmanın bir kaç yolu vardır.

Eğer çalıştı glob() mü?:

$files = glob("{$picsDir}/*.{gif,jpeg,jpg,png}", GLOB_BRACE);

Eğer kabul mü pathinfo()?:

$info = pathinfo($file);
switch(strtolower($info['extension'])) {
    case 'jpeg':
    case 'jpg':
    case 'gif':
    case 'png':
        $files[] = $file;
        break;
}

Eğer düzenli ifadeyi kullanarak üzerine insistant iseniz, tüm dosya, sadece uzantısı maç için gerek yoktur. Dizenin sonuna maç için $ belirteci kullanabilir, ve vaka-duyarsızlığı göstermek için i bayrağını kullanın. Ayrıca, benim durumumda "%" in, senin ifadede bir sınırlayıcı kullanmayı unutmayın:

$rex = '%\.(gif|jpe?g|png)$%i';