Pregunta ¿Cómo obtener (extraer) una extensión de archivo en PHP?


Esta es una pregunta que puede leer en cualquier lugar de la web con varias respuestas:

$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];

etc.

Sin embargo, siempre hay "la mejor manera" y debe estar en Desbordamiento de pila.


611
2017-10-06 11:00


origen


Respuestas:


Las personas de otros lenguajes de scripting siempre piensan que el suyo es mejor porque tienen una función incorporada para hacer eso y no PHP (estoy viendo pythonistas ahora mismo :-)).

De hecho, existe, pero pocas personas lo saben. Reunirse pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

Esto es rápido y está incorporado. pathinfo() puede proporcionarle otra información, como una ruta canónica, según la constante que le pase.

Recuerde que si desea poder tratar con caracteres que no sean ASCII, primero debe establecer la configuración regional. P.EJ:

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

También tenga en cuenta que esto no tiene en cuenta el contenido del archivo ni el tipo de letra mimet, solo obtiene la extensión. Pero es lo que pediste.

Por último, tenga en cuenta que esto solo funciona para una ruta de archivo, no una ruta de recursos de URL, que se cubren con PARSE_URL.

Disfrutar


1554
2017-10-06 11:03



pathinfo()

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

echo $path_info['extension']; // "bill"

136
2017-10-06 11:02



usar más seguro: PARSE_URL (en lugar de PATHINFO)


por ejemplo, url es http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

PATHINFO devoluciones:

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


PARSE_URL devoluciones:

$x = parse_url($url);
$x['scheme']  🡺 'http'
$x['host']    🡺 'example.com'
$x['path']    🡺 '/myfolder/sympony.mp3'
$x['query']   🡺 'aa=1&bb=2'
$x['fragment']🡺 ''             //<----- this outputs hashtag "XYZ" only in case, when the link containing that hashtag was manually passed to function, because automatically, hashtags are not automatically detectable by PHP

dirname(parse_url($url)['path'])                      🡺 /myfolder
basename(parse_url($url))                             🡺 sympony.mp3
pathinfo(parse_url($url)['path'], PATHINFO_EXTENSION) 🡺 mp3

PD. nota, parte Hashtag de url (es decir #smth) no disponible en solicitud PHP, pero solo con javascript.


Para ejemplos útiles, ver: Obtenga la URL completa en PHP


67
2017-07-17 12:39



También hay SplFileInfo:

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

A menudo puedes escribir un código mejor si pasas ese objeto en vez de una cadena, entonces tu código es más hablado. Desde PHP 5.4, este es un juego de una sola línea:

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

50
2017-10-17 10:32



La respuesta de E-satis es la forma correcta de determinar la extensión del archivo.

Alternativamente, en lugar de confiar en una extensión de archivos, puede usar el archivo info (http://us2.php.net/fileinfo) para determinar los archivos tipo MIME.

Aquí hay un ejemplo simplificado de procesamiento de una imagen cargada por un usuario:

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

18
2017-10-06 14:23



1) Si estás usando (PHP 5> = 5.3.6) puedes usar SplFileInfo :: getExtension - Obtiene la extensión de archivo

Código de ejemplo

<?php

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

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

?>

Esto producirá

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

2) Otra forma de obtener la extensión si está usando (PHP 4> = 4.0.3, PHP 5) es pathinfo

Código de ejemplo

<?php

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

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

?>

Esto producirá

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

// EDIT: eliminó un corchete


12
2017-08-02 07:52



A veces es útil no usar pathinfo($path, PATHINFO_EXTENSION), por ejemplo:

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

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

También tenga en cuenta que pathinfo no puede manejar algunos caracteres que no son ASCII (generalmente solo los suprime del resultado), en extensiones que generalmente no son un problema, pero no está de más saber que hay una advertencia.


9
2017-11-01 18:11



Siempre que no contenga ruta también puede usar:

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

Dónde $fname es un nombre del archivo, por ejemplo: my_picture.jpg Y el resultado sería: jpg


8
2017-08-11 12:42



La forma más sencilla de obtener la extensión de archivo en php es usar la función incorporada de php pathinfo.

$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // the out should be extension of file eg:-png, gif, html

7
2018-05-13 06:44