2008-11-26 11 views
15

Ich lese alle Dateien in einem einzigen Verzeichnis und möchte nach JPG, JPEG, GIF und PNG filtern.Suche nach Dateierweiterungen in PHP mit regulären Ausdrücken

Sowohl Groß- als auch Kleinbuchstaben. Dies sind die einzigen Dateien, die akzeptiert werden.

ich dies derzeit mit bin:

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

und die Funktion takeFiles sieht wie folgt aus:

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

Und es gibt immer nichts. Also muss etwas mit meinem Regex-Code nicht stimmen.

Antwort

30

Ich denke, etwas stimmt nicht mit Ihrer Regex. Versuchen Sie reguläre Ausdrücke hier erste Prüfung: http://www.spaweditor.com/scripts/regex/index.php

denke ich, dieses könnte für Sie arbeiten:

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

Beachten Sie die/i am Ende - das ist der „Groß- und Kleinschreibung“ Flag ist, sparen Sie mit zu tippe alle Permutationen aus :)

+1

Sie den Punkt zu entkommen. – Mark

+1

Danke Mark, behoben. Oh! –

+0

@PhillSacre der Link zu SpawEditor ist abgelaufen. Können Sie bitte Ihre Antwort aktualisieren? –

1

Du solltest Slashes um deine Regexp legen. -> "/(...)/"

11

Wie wäre es stattdessen mit glob()?

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

Als eine Randnotiz, stellen Sie sicher, $ dir endet mit einem Verzeichnistrennzeichen. – Powerlord

+0

Gibt es eine Möglichkeit, diese Funktion zu verwenden und nur Dateinamen ohne den vollständigen Pfad zurückzugeben? –

0

Es gibt ein paar Möglichkeiten, dies zu tun.

Haben Sie glob() versucht:

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

Haben Sie pathinfo() betrachtet:

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

Wenn Sie den regulären Ausdruck bei Verwendung insistant sind,

gibt es keine Notwendigkeit, den gesamten Dateinamen übereinstimmen, nur die Erweiterung. Verwenden Sie das Token $, um das Ende der Zeichenfolge abzugleichen, und verwenden Sie das Flag i, um die Groß-/Kleinschreibung zu berücksichtigen. Vergessen Sie auch nicht ein Trennzeichen in Ihrem Ausdruck, in meinem Fall „%“ zu verwenden:

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

Gibt es einen Grund, warum Sie nicht verwenden scandir und pathinfo wollen?

So können Sie auch überprüfen, ob die Datei ein Verzeichnis ist und einen rekursiven Aufruf ausführen, um dieses Verzeichnis zu scannen. Ich habe den Code in Eile geschrieben, damit er nicht zu 100% korrekt ist.

+0

Dieser Antwort sollte an der Spitze sein. Regexp sind oft übertrieben. Ich liebe sie, aber du musst bei KISS bleiben, wenn es möglich ist. –

1

Dies funktioniert für mich

$string = "your-file-name.jpg"; 
preg_match("/\b(\.jpg|\.JPG|\.png|\.PNG|\.gif|\.GIF)\b/", $string, $output_array); 

Beste.

0

Hier sind zwei verschiedene Möglichkeiten, ein Array von Dateien nach Typ (conf für Demo) aus einem Zielverzeichnis zu kompilieren. Ich bin mir nicht sicher, welche Leistung besser ist.

$path = '/etc/apache2/'; 
    $conf_files = []; 

    // Remove . and .. from the returned array from scandir 
    $files = array_diff(scandir($path), array('.', '..')); 
    foreach($files as $file) { 
     if(in_array(pathinfo($file, PATHINFO_EXTENSION), ['conf'])) { 
      $conf_files[] = $file; 
     } 
    } 
    return $conf_files; 

Dies wird den vollständigen Dateipfad zurückkehren der Dateiname nicht nur

return $files = glob($path . '*.{conf}',GLOB_BRACE); 
Verwandte Themen