2016-08-05 7 views
0

Ich habe ein PHP-Programm, das einen Ordner mit dem Namen output (der alle Bilddateien in einem beliebigen Format enthält) für Bilder scannt. Die Bilddateien sind die Screenshots der Ausgabe im Terminal (ich verwende Linux) verschiedener Java-Programme. Die Bilddateien werden nach dem Klassennamen benannt, in dem sich die main()-Funktion befindet. Wenn also beispielsweise die main()-Funktion in der öffentlichen Example-Klasse enthalten ist, wird das Ausgabebild mit dem Namen Example mit der Erweiterung .jpg, .jpeg, .png oder .gif benannt. Das PHP-Programm hat eine Titelseite, die nach Java-Dateien sucht und sie in einer ungeordneten Liste mit Links auflistet, auf die der Benutzer klicken kann, um auf die nächste Seite zu gelangen. Die nächste Seite liest die jeweilige Datei und zeigt den Quellcode zusammen mit dem Screenshot der Ausgabe an. Nun, da ich bin mit Fedora und Fedora nimmt Screenshots in png Format, das ist ganz einfach, wie:Wie lade ich ein Bild, das mit einer beliebigen Dateityperweiterung in PHP endet, mit Regular Expressions?

echo '<img src="' . $file_name . '".png>' 

Aber was, wenn jemand lädt ein Java-Programm mit dem Ausgang Screenshot in einem beliebigen Format? (jpg, jpeg, png, gif). Wie lade ich dann die entsprechende Bilddatei, da ich nicht weiß, wie die Erweiterung sein wird?

Ich habe eine Antwort foreach Schleife zu verwenden und jede Bilddatei dort im Ausgabeordner ist durchlesen und dann eine if Bedingung verwenden Sie die entsprechenden Dateinamen mit den verschiedenen Erweiterungen für die Kontrolle, aber ich denke, es ist nicht sehr gut sein wird Programmierpraxis.

Ich versuche generell, Bedingungen zu vermeiden, während Programmierung und Verwendung mathematischer Ansatz Ursache, dass gibt mir die Herausforderung, die ich brauche, und ich fühle meinen Code sieht anders und einzigartig im Vergleich zu anderen, aber ich scheint es diesmal nicht funktionieren .

Ich fühle, dass dies mit regulären Ausdrücken getan werden kann, aber ich weiß nicht, wie es geht. Ich kenne reguläre Ausdrücke, aber ich habe keine Ahnung, wie man sie benutzt. Jede Antwort, die nicht regulär verwendet wird, wird geschätzt, aber ich möchte dies mit regulären Ausdrücken machen, weil ich auf diese Weise auch ein wenig Wissen zu meinen regulären Ausdruckskonzepten hinzufügen werde.

Danke.

+0

Warum Ausgaben als Screenshot gespeichert werden * (und als Text notieren) *? Was für eine verrückte Idee! Warum weißt du nicht, was die Erweiterung ist? –

+0

Da jeder eine Quelldatei für jede Sprache hinzufügen kann, wird die Ausgabe auch in einer Bilddatei gespeichert, die eine beliebige Erweiterung haben kann. –

Antwort

1

Eine mögliche Lösung, können Sie überprüfen, ob die Datei mit dieser Erweiterung vorhanden ist (vorausgesetzt, Sie mehrere Bilder nicht mit dem gleichen Namen, aber unterschiedliche Erweiterungen haben):

function get_image($file_name) { 
    if (file_exists($file_name . '.png')) { 
     return $file_name . '.png'; 
    } elseif (file_exists($file_name . '.jpg')) { 
     return $file_name . '.jpg'; 
    } elseif (file_exists($file_name . '.gif')) { 
     return $file_name . '.gif'; 
    } 

    return false; 
} 

echo '<img src="' . get_image($file_name) . '">'; 
0

Sie definieren das Muster als oder Liste der verschiedenen Erweiterungen:

$pattern = '/\.(jpg|png|gif)$/i'; 

Wir auch sicher machen dies ist eine Erweiterung durch das Spiel mit einem Punkt darunter (entkommen) und sicherstellen, dass es am Ende des Strings ist ($). Das "i" am Ende ermöglicht die Unterscheidung zwischen Groß- und Kleinschreibung, so dass die Regex immer noch GIF oder JPG in Dateinamen aufnimmt.

Danach ist der Test ziemlich einfach:

if (preg_match($pattern, $filename)) { 
    echo "File $filename is an image"; 
} 

es zusammen in einem Beispiel Einlochen, können Sie sehen:

$filename = 'test.png'; 
$pattern = '/\.(jpg|png|gif)$/i'; 

if (preg_match($pattern, $filename)) { 
    echo "File $filename is an image"; 
} 

https://eval.in/618651

Ob das wickeln wollen in Eine Funktion liegt bei Ihnen, da Sie entscheiden müssen, was Sie zurückgeben möchten, falls der Dateiname nicht mit einer der angegebenen Erweiterungen übereinstimmt. Bitte beachten Sie, dass der Test auf der Erweiterung nur und nicht auf dem Inhalt basiert.

1

Hier ist eine Alternative zu den MMs, die RegEx verwendet:

function getImageFilename ($basename, $directory) { 

    $filenames = scandir($directory); 
    $pattern = "/^" . $basename . "\.(jpeg|png|jpg|gif)$/"; 

    foreach($filenames as $filename) { 
     preg_match($pattern, $filename, $matches); 
     if($matches) { 
      return $filename; 
     } 
    } 

    return false; 
} 

Sie können mit einer Schleife nicht vermeiden. Sie durchlaufen entweder die möglichen Dateinamen und prüfen deren Existenz, oder Sie erhalten eine Liste aller Dateien im Verzeichnis und durchlaufen diese, während Sie eine Musterübereinstimmung durchführen.

Wenn sich nicht viele Dateien im Verzeichnis befinden, kann diese Funktion besser sein, da sie das Betriebssystem nur einmal aufrufen muss (um eine Liste der Dateien im Verzeichnis zu erhalten), während das Betriebssystem dies überprüft Wenn mehrere Dateien vorhanden sind, sind mehrere Systemaufrufe erforderlich. (Ich denke, das ist richtig ...)