webentwicklung-frage-antwort-db.com.de

Wie bekomme ich eine Dateierweiterung in PHP?

Diese Frage können Sie überall im Internet mit verschiedenen Antworten lesen:

$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);

$exts = split("[/\\.]", $filename);
$n    = count($exts)-1;
$ext  = $exts[$n];

usw.

Es gibt jedoch immer "den besten Weg" und es sollte auf Stapelüberlauf sein.

687
e-satis

Leute aus anderen Skriptsprachen denken immer, dass ihre besser sind, weil sie eine eingebaute Funktion dafür haben und nicht PHP (ich sehe gerade Pythonistas :-)).

Tatsächlich existiert es, aber nur wenige Menschen wissen es. Treffen Sie pathinfo() :

$ext = pathinfo($filename, PATHINFO_EXTENSION);

Das ist schnell und eingebaut. pathinfo() kann Ihnen je nach der Konstante, die Sie an sie übergeben, andere Informationen wie z. B. den kanonischen Pfad geben.

Denken Sie daran, dass Sie zuerst das Gebietsschema festlegen müssen, wenn Sie in der Lage sein möchten, mit Nicht-ASCII -Zeichen umzugehen. Z.B:

setlocale(LC_ALL,'en_US.UTF-8');

Beachten Sie außerdem, dass dies den Dateiinhalt oder den MIME-Typ nicht berücksichtigt. Sie erhalten nur die Erweiterung. Aber darum haben Sie gebeten.

Beachten Sie zum Schluss, dass dies nur für einen Dateipfad funktioniert, nicht für einen URL-Ressourcenpfad, der mit PARSE_URL abgedeckt wird.

Genießen

1708
e-satis

pathinfo()

$path_info = pathinfo('/foo/bar/baz.bill');

echo $path_info['extension']; // "bill"
155
Adam Wright

Beispiel-URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

Verwenden Sie für URLs nicht PATHINFO :

_$x = pathinfo($url);
$x['dirname']   ???? 'http://example.com/myfolder'
$x['basename']  ???? 'sympony.mp3?a=1&b=2#XYZ'         // <------- BAD !!
$x['extension'] ???? 'mp3?a=1&b=2#XYZ'                 // <------- BAD !!
$x['filename']  ???? 'sympony'
_

Verwenden Sie stattdessen PARSE_URL :

_$x = parse_url($url);
$x['scheme']  ???? 'http'
$x['Host']    ???? 'example.com'
$x['path']    ???? '/myfolder/sympony.mp3'
$x['query']   ???? 'aa=1&bb=2'
$x['fragment']???? 'XYZ'
_

Hinweis: Hashtags sind nur dann serverseitig verfügbar, wenn sie manuell hinzugefügt wurden.


Alle nativen PHP Beispiele finden Sie unter: Vollständige URL in PHP abrufen

90
T.Todua

Es gibt auch SplFileInfo :

$file = new SplFileInfo($path);
$ext  = $file->getExtension();

Oft können Sie besseren Code schreiben, wenn Sie ein solches Objekt anstelle einer Zeichenfolge übergeben. Ihr Code spricht dann mehr. Seit PHP 5.4 ist dies ein Einzeiler:

$ext  = (new SplFileInfo($path))->getExtension();
56
hakre

Die Antwort von E-satis ist der richtige Weg, um die Dateierweiterung zu bestimmen.

Anstatt sich auf eine Dateierweiterung zu verlassen, können Sie auch fileinfo verwenden, um den MIME-Dateityp zu bestimmen.

Hier ist ein vereinfachtes Beispiel für die Verarbeitung eines von einem Benutzer hochgeladenen Bildes:

// Code assumes necessary extensions are installed and a successful file upload has already occurred

// Create a FileInfo object
$finfo = new FileInfo(null, '/path/to/magic/file');

// Determine the MIME type of the uploaded file
switch ($finfo->file($_FILES['image']['tmp_name'], FILEINFO_MIME)) {        
    case 'image/jpg':
        $im = imagecreatefromjpeg($_FILES['image']['tmp_name']);
    break;

    case 'image/png':
        $im = imagecreatefrompng($_FILES['image']['tmp_name']);
    break;

    case 'image/gif':
        $im = imagecreatefromgif($_FILES['image']['tmp_name']);
    break;
}
21
Toxygene

1) Wenn Sie verwenden (PHP 5> = 5.3.6) können Sie verwenden SplFileInfo :: getExtension - Ermittelt die Dateierweiterung

Beispielcode

<?php

$info = new SplFileInfo('test.png');
var_dump($info->getExtension());

$info = new SplFileInfo('test.tar.gz');
var_dump($info->getExtension());

?>

Dies wird ausgegeben

string(3) "png"
string(2) "gz"

2) Eine andere Möglichkeit, die Erweiterung zu erhalten, wenn Sie verwenden (PHP 4> = 4.0.3, PHP 5) ist pathinfo

Beispielcode

<?php

$ext = pathinfo('test.png', PATHINFO_EXTENSION);
var_dump($ext);

$ext = pathinfo('test.tar.gz', PATHINFO_EXTENSION);
var_dump($ext);

?>

Dies wird ausgegeben

string(3) "png"
string(2) "gz"

// EDIT: entfernte eine Klammer

12
Subodh Ghulaxe

Solange es keinen Pfad enthält, können Sie auch Folgendes verwenden:

array_pop(explode('.', $fname))

Wobei $fname ein Name der Datei ist, zum Beispiel: my_picture.jpg. Und das Ergebnis wäre: jpg

11
Anonymous

Manchmal ist es sinnvoll, pathinfo($path, PATHINFO_EXTENSION) nicht zu verwenden. Zum Beispiel:

$path = '/path/to/file.tar.gz';

echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz

Beachten Sie auch, dass pathinfo einige Nicht-ASCII-Zeichen nicht verarbeiten kann (normalerweise werden sie nur aus der Ausgabe entfernt). Bei Erweiterungen ist das normalerweise kein Problem, aber es tut nicht weh, sich dieser Einschränkung bewusst zu sein.

10
Alix Axel

Sie können auch dies versuchen (es funktioniert auf PHP 5. * und 7):

$info = new SplFileInfo('test.Zip');
echo $info->getExtension(); // ----- Output -----> Zip

Tipp: Es wird eine leere Zeichenfolge zurückgegeben, wenn die Datei keine Erweiterung hat

7
pooya_sabramooz

Der einfachste Weg, eine Dateierweiterung in PHP zu erhalten, ist die Verwendung der eingebauten PHP-Funktion pathinfo .

$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // The output should be the extension of the file e.g., png, gif, or html
7
Shahbaz

Eine schnelle Lösung wäre so etwas.

// Exploding the file based on the . operator
$file_ext = explode('.', $filename);

// Count taken (if more than one . exist; files like abc.fff.2013.pdf
$file_ext_count = count($file_ext);

// Minus 1 to make the offset correct
$cnt = $file_ext_count - 1;

// The variable will have a value pdf as per the sample file name mentioned above.
$file_extension = $file_ext[$cnt];
5
version 2
substr($path, strrpos($path, '.') + 1);
5
Kurt Zhong

pathinfo ist ein Array. Wir können den Verzeichnisnamen , den Dateinamen, die Erweiterung usw. überprüfen:

$path_parts = pathinfo('test.png');

echo $path_parts['extension'], "\n";
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['filename'], "\n";
5
Arshid KV

Hier ist ein Beispiel. Angenommen, $ filename ist "example.txt",

$ext = substr($filename, strrpos($filename, '.', -1), strlen($filename));

Also wird $ ext ".txt" sein.

4
G. I. Joe

Das wird funktionieren

$ext = pathinfo($filename, PATHINFO_EXTENSION);
3
Deepika Patel

Ich habe festgestellt, dass die Lösungen pathinfo() und SplFileInfo für Standarddateien im lokalen Dateisystem gut funktionieren, aber Sie können auf Schwierigkeiten stoßen, wenn Sie mit Remotedateien arbeiten, da URLs für gültige Bilder möglicherweise einen # haben. (Fragment-IDs) und/oder ? (Abfrageparameter) am Ende der URL, die beide Lösungen (falsch) als Teil der Dateierweiterung behandeln.

Ich habe festgestellt, dass dies eine zuverlässige Methode ist, um pathinfo() für eine URL zu verwenden, nachdem sie zuerst analysiert wurde, um das unnötige Durcheinander nach der Dateierweiterung zu beseitigen:

$url_components = parse_url($url); // First parse the URL
$url_path = $url_components['path']; // Then get the path component
$ext = pathinfo($url_path, PATHINFO_EXTENSION); // Then use pathinfo()
3
Jonathan Ellis

Verwenden Sie substr($path, strrpos($path,'.')+1);. Es ist die schnellste Methode aller Vergleiche.

@ Kurt Zhong bereits beantwortet.

Lassen Sie uns das Vergleichsergebnis hier überprüfen: https://eval.in/661574

2
Abbas

Sie können auch Folgendes versuchen:

 pathinfo(basename($_FILES["fileToUpload"]["name"]), PATHINFO_EXTENSION)
2
smile 22121

Obwohl der "beste Weg" umstritten ist, glaube ich, dass dies aus mehreren Gründen der beste Weg ist:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. Es funktioniert mit mehreren Teilen einer Erweiterung, zB tar.gz
  2. Kurzer und effizienter Code
  3. Es funktioniert sowohl mit einem Dateinamen als auch mit einem vollständigen Pfad
1
Dan Bray

Sie können alle Dateierweiterungen in einem bestimmten Ordner abrufen und Vorgänge mit einer bestimmten Dateierweiterung ausführen:

<?php
    $files = glob("abc/*.*"); // abc is the folder all files inside folder
    //print_r($files);
    //echo count($files);
    for($i=0; $i<count($files); $i++):
         $extension = pathinfo($files[$i], PATHINFO_EXTENSION);
         $ext[] = $extension;
         // Do operation for particular extension type
         if($extension=='html'){
             // Do operation
         }
    endfor;
    print_r($ext);
?>
1

Wenn Sie nach Geschwindigkeit suchen (z. B. in einem Router), möchten Sie wahrscheinlich nicht alles mit einem Token versehen. Viele andere Antworten schlagen mit /root/my.folder/my.css fehl

ltrim(strrchr($PATH, '.'),'.');
1
Ray Foss

IMO, dies ist der beste Weg, wenn Sie Dateinamen wie name.name.name.ext haben (hässlich, aber es kommt manchmal vor):

$ext     = explode('.', $filename); // Explode the string
$ext_len = count($ext) - 1; // Count the array -1 (because count() starts from 1)
$my_ext  = $ext[$ext_len]; // Get the last entry of the array

echo $my_ext;
0
Tommy89

Eigentlich habe ich danach gesucht.

<?php

$url = 'http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ';
$tmp = @parse_url($url)['path'];
$ext = pathinfo($tmp, PATHINFO_EXTENSION);

var_dump($ext);
0
Fred

ltrim(strstr($file_url, '.'), '.')

dies ist der beste Weg, wenn Sie Dateinamen wie name.name.name.ext haben (hässlich, aber es kommt manchmal vor

0
Anjani Barnwal