¿Cómo puedo obtener (extracto) una extensión de archivo en PHP?

Esta es una pregunta que usted puede leer en todas partes en 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, no siempre es «la mejor manera», y debe ser en Stack Overflow.

InformationsquelleAutor e-satis | 2008-10-06

27 Kommentare

  1. 1725

    Personas de otros lenguajes de scripting siempre piensa que lo suyo es lo mejor porque tienen una función integrada para hacer eso y no de PHP (estoy buscando en Pythonistas ahora mismo :-)).

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

    $ext = pathinfo($filename, PATHINFO_EXTENSION);

    Esto es rápido y construido en. pathinfo() puede dar otra información, tal como canónica de la ruta, dependiendo de la constante que se le pasa.

    Recuerde que si usted quiere ser capaz de tratar con la falta de caracteres ASCII, es necesario establecer la configuración regional de primera. E. G:

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

    También, tenga en cuenta que esto no toma en consideración el contenido del archivo o tipo mime, usted consigue solamente la extensión. Pero lo que usted pidió.

    Por último, tenga en cuenta que esto sólo funciona para una ruta de archivo, no una URL de los recursos de la ruta, que es cubierto mediante PARSE_URL.

    Disfrutar de

    • Ojalá pudiera votar dos veces. Yo no te puedo decir la cantidad de código que he sido capaz de reemplazar el uso de pathinfo
    • Yo por Eso he puesto aquí !
    • Whaddaya saber, resulta que hay una mejor manera.
    • mi pathinfo está desactivado, entonces camino más corto para extraer la extensión de la cadena ?
    • Usted debe buscar otro proveedor de hosting, el que tienes es estúpido. Realmente, lo digo en serio. Hay sin razón alguna para deshabilitar esta función. Les digo que. Como una solución: function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); } asegúrese de que el archivo tiene una extensión embargo, se puede hacer cualquier cosa cuando se pasa una ruta de acceso como argumento!
    • Tengo un problema con este ejemplo – no es lo que nombres como los de «………….doc», alguna idea de por qué ?
    • mi idea de PHP en comparación con python cambiado completamente, ahora que sé acerca de esta función :O
    • He votado por la forma en que lo escribió… 😀 Un poco de alegría en una vida de programador vale 100 buenas obras.
    • Esto es simplemente increíble! Donde estaba esta de hace 7 años?
    • Te Amo. #nohomo
    • pero no su trabajo en un escenario en mi aplicación, Como algunas veces me estoy poniendo de una dirección URL en el siguiente formato , www.domain.com/image.php?id=123&idlocation=987&number=01 para descargar las imágenes desde esta uRL no tienen el nombre de la imagen o la extensión de la pathifo() es failling para darnos la extensión de la imagen . ENTONCES, ¿qué debe ser hecho por favor!!! me ayudan
    • En realidad no es justo que yo no la basura tanto como algunas de las otras personas que están aquí, y en lugar de encontrar esta respuesta y resuelto mi problema rápidamente.
    • Esto NO es una solución segura. Si alguien subido a su extremo sin necesidad de utilizar un navegador que podría suplantar la extensión. Por ejemplo: pathinfo(‘imagen.jpg.falso’,PATHINFO_EXTENSION) devuelve ‘falso’ !! No verificación de archivo real cuerpo ya que no tiene la ruta de acceso del archivo, y no se compruebe su resultado con un MimeType Mapa. Usted debe asegurarse de que el valor que usted recibe de este es de hecho un tipo válido consultando iana.org/assignments/media-types/media-types.txt o mediante la comprobación de su propia MimeType Mapa.
    • tenga CUIDADO!!!!! ESTO NO ES UN FUNCIONAMIENTO SEGURO !!! leer otras respuestas!

  2. 163

    pathinfo()

    $path_info = pathinfo('/foo/bar/baz.bill');
    
    echo $path_info['extension']; //"bill"
    • Esta es «la mejor manera»
    • A partir de PHP 5.5 -> echo pathinfo('/foo/bar/baz.bill')['extension'];
    • Esto funciona incluso en este nivel (Twitter json): $ext = pathinfo($resultado->extended_entities->medios de comunicación[0]->video_info->variantes[1]->url, PATHINFO_EXTENSION);
  3. 94

    Dirección URL de ejemplo: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

    De las Url, no uso 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'

    Uso PARSE_URL lugar:

    $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'

    Nota: los hashtags no están disponibles en el lado del servidor, sólo en caso de agregar manualmente.


    Para todos los nativos de PHP ejemplos, véase: Obtener la URL completa de la página en PHP

    • Esta respuesta lo cubre todo, por ejemplo. un archivo como foo_folder/foo-file.jpg?1345838509 va a fracasar miserablemente con sólo pathinfo, gracias
    • No completamente en el tema, pero seguro que lo hizo a solucionar mi problema!
    • No se te olvida nada! parse_url es la dirección URL y pathinfo es para la ruta de acceso del archivo.
    • ¿Qué significa «olvidar ruta info»? Se utiliza en la solución!
    • Él no, él sólo mostró las diferencias entre pathinfo y parse_url.
  4. 57

    También hay SplFileInfo:

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

    A menudo usted puede escribir mejor código si se pasa un objeto en lugar de una cadena. El código es más de hablar a continuación. A partir de PHP 5.4 esto es un one-liner:

    $ext  = (new SplFileInfo($path))->getExtension();
    • Fantástico, Sus Objetos de todo el camino hacia abajo 🙂
    • Por favor, ser conscientes de que ->getExtension() está disponible en SplFileInfo desde PHP 5.3.6.
    • Por favor, ser conscientes de que SPL puede ser deshabilitado en versiones de PHP anteriores a la de PHP 5.3.0 liberación. Si todavía no estás ejecutando PHP 5.3, pero 5.2 o inferior, la respuesta más probable no aptos para el código estable. De lo contrario, usted puede estabilizar el código que requiere un específico de la versión de PHP y de lo contrario pagar una fianza.
    • Mientras que usted está en lo correcto en decir que «puede ser desactivada en las versiones anteriores a 5.3.0», la extensión SPL es, sin embargo, compilado por defecto a partir de PHP 5.0.0. Así que este comentario hace que, de hecho sentido para las personas obligadas a utilizar PHP 5.2 o inferior y que no quieren renunciar el uso específico de SPL clases.
    • sí, acaba de morir versión de la pelusa 🙂
    • $ext = pathinfo($file, PATHINFO_EXTENSION) o $ext = pathinfo($file)['extension'] son mejor que uno-trazadores de líneas.

  5. 21

    E-satis la respuesta es la correcta para determinar la extensión de archivo.

    Alternativamente, en lugar de confiar en una extensión de archivos, puede utilizar el fileinfo para determinar los archivos de tipo MIME.

    He aquí un ejemplo simplificado de procesamiento de una imagen subida 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;
    }
    • Esta es la ÚNICA respuesta correcta. No entiendo por qué la gente votó a los demás. Sí, este enfoque exige más esfuerzos de los desarrolladores, pero aumenta el rendimiento(aunque muy poco, pero lo hace). Por favor, consulte este.
    • En algunos casos, puede que sólo necesite la extensión de archivo, que sobre el tipo mime de verificación. Pero la verdadera pregunta es acerca de la extensión de archivo, no el tipo de archivo. Así que esta NO es la mejor respuesta para esta pregunta. (sin embargo, una respuesta)
    • este interruptor necesitan un extra de paréntesis
  6. 13

    Mientras no contiene una ruta de acceso puede utilizar también:

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

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

    • este tiene 3 downvotes? su resultado correcto. Por favor explique
    • No es malo, simplemente no es la mejor manera de hacerlo. Upvoted para un poco de equilibrio.
    • Esta es la mejor manera, cuando usted necesita el real extensión y el nombre de archivo puede tener varios .’s en ella, como usuario subido fotos en mi caso.
    • Esto produce un error si el nombre de archivo no tiene extensión. Intentar pasar en «miarchivo» y que volverá «miarchivo». El correcto valor devuelto es una cadena vacía como la extensión en este caso de uso.
    • Esto es incorrecto en que array_pop() generará un aviso, ya que se necesita un puntero como parámetro.
  7. 12

    1) Si usted está usando (PHP 5 >= 5.3.6)
    usted puede utilizar 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());
    
    ?>

    Esta es la salida

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

    2) Otra manera de conseguir la extensión si está utilizando (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);
    
    ?>

    Esta es la salida

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

    //EDIT: se ha eliminado un soporte

  8. 10

    A veces es útil para no utilizar 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 manejar algunos caracteres no ASCII (generalmente sólo se elimina de la salida). En las extensiones que por lo general no es un problema, pero no me duele ser consciente de esa limitación.

    • +1, pero es un área gris. Es tar.gz la extensión, o .gz ?
    • De acuerdo a la Wikipedia son dos extensiones: El UNIX-como sistemas de archivos utilizan un modelo diferente sin el segregada de la extensión de los metadatos. El carácter de punto es sólo otro personaje en el principal nombre de archivo y los nombres de archivo pueden tener múltiples extensiones, por lo general representan a anidada transformaciones, tales como files.tar.gz.
    • Y si tenemos un punto en el nombre del producto? Ex : test.19-02-2014.jpeg
    • Esta no en /root/mi.carpeta/mi.css ltrim(strrchr($PATH, '.'),'.') funciona como pathinfo, pero sin encadenamiento de todo.
  9. 7

    La forma más sencilla de obtener la extensión de archivo en PHP es usar PHP la función integrada 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
  10. 7

    Puedes probar también este (funciona en PHP 5.* y 7):

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

    Sugerencia: devuelve una cadena vacía si el archivo no tiene extensión

  11. 5
    substr($path, strrpos($path, '.') + 1);
    • Esta no en /root/mi.carpeta/mi.css
    • Esto debe funcionar correctamente: substr($path, strrpos($path,’.’)+1); Nota: este método es más rápido que cualquier otra solución anterior. Pruebe con un punto de referencia utilizando nuestro propio guión.
  12. 5

    Una solución rápida sería algo como esto.

    //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];
    • ¿Por qué no usar php construido en función de la finalidad php.net/manual/en/function.pathinfo.php en lugar de utilizar código largo
    • Además de Shahbaz punto también puede hacer $file_ext = end(explode('.', $filename)); hacer de todo en esta respuesta en una sola línea en vez de cuatro.
    • Lo que si tiene .tar.gz. No va a funcionar, así que si usted necesita para obtener el pleno de la extensión de uso, tales como ltrim(strstr($filename, '.'), '.'); a recibir la totalidad de la extensión en lugar uncorrectly como gz.
  13. 5

    Aquí es un ejemplo. Supongamos que $archivo es «example.txt»,

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

    Por lo que $ext será «.txt».

  14. 5

    pathinfo es una matriz. Podemos comprobar nombre de directorio, nombre de archivo, extensión, etc.:

    $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";
  15. 3

    Esto funcionará

    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    • Esto ya ha sido respondido mucho mejor por: Subodh en agosto.
  16. 3

    Me encontré con que el pathinfo() y SplFileInfo soluciones funciona bien para los archivos de estándares en el sistema de archivos local, pero se puede ejecutar en dificultades si está trabajando con archivos remotos como las Url de las imágenes válidas puede tener un # (identificadores de fragmento) y/o ? (parámetros de consulta) en la final de la URL, que tanto estas soluciones (incorrecto) tratar como parte de la extensión de archivo.

    He encontrado esta fue una manera confiable de uso pathinfo() en una dirección URL después de analizar primero se tira a la basura innecesaria después de la extensión de archivo:

    $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()
  17. 2

    Uso substr($path, strrpos($path,'.')+1);. Es el método más rápido de todos los compara.

    @Kurt Zhong ya contestadas.

    Vamos a comprobar el resultado comparativo aquí: https://eval.in/661574

  18. 2

    Lo siento… «Pregunta Corta, Pero NO por Respuesta Corta»

    Ejemplo 1 para la RUTA

    $path = "/home/ali/public_html/wp-content/themes/chicken/css/base.min.css";
    $name = pathinfo($path, PATHINFO_FILENAME);
    $ext  = pathinfo($path, PATHINFO_EXTENSION);
    printf('<hr> Name: %s <br> Extension: %s', $name, $ext);

    Ejemplo 2 para la dirección URL

    $url = "//www.example.com/dir/file.bak.php?Something+is+wrong=hello";
    $url = parse_url($url);
    $name = pathinfo($url['path'], PATHINFO_FILENAME);
    $ext  = pathinfo($url['path'], PATHINFO_EXTENSION);
    printf('<hr> Name: %s <br> Extension: %s', $name, $ext);

    Salida de ejemplo 1:

    Name: base.min
    Extension: css

    Salida de ejemplo 2:

    Name: file.bak
    Extension: php

    Referencias

    1. https://www.php.net/manual/en/function.pathinfo.php

    2. https://www.php.net/manual/en/function.realpath.php

    3. https://www.php.net/manual/en/function.parse-url.php

  19. 1

    Si usted está buscando para la velocidad (como un router), es probable que no quieras para acortar el todo. Muchas otras respuestas se producirá /root/my.folder/my.css

    ltrim(strrchr($PATH, '.'),'.');
  20. 1

    A pesar de la «mejor manera» es discutible, creo que este es el mejor camino para un par de razones:

    function getExt($path)
    {
        $basename = basename($path);
        return substr($basename, strlen(explode('.', $basename)[0]) + 1);
    }
    1. Trabaja con múltiples partes a una extensión, por ejemplo, la tar.gz
    2. Corto y eficiente de código
    3. Se trabaja con un nombre de archivo y una ruta de acceso completa
  21. 1

    Usted puede conseguir todas las extensiones de archivo en una carpeta en particular y hacer operaciones con una determinada extensión de archivo:

    <?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);
    ?>
  22. 0

    Realidad, yo estaba buscando.

    <?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);
  23. 0

    De la OMI, esta es la mejor manera si tienen nombres de archivo como nombre.nombre.nombre.ext (feo, pero a veces ocurre):

    $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;
  24. 0

    $ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $fileName);

    preg_replace enfoque que el uso regular de la expresión de búsqueda y reemplazo. En función preg_replace primer parámetro es el patrón de la búsqueda, el segundo parámetro $1 es una referencia a lo que es comparable con la de la primera (.*) y el tercer parámetro es el nombre del archivo.

    De otra manera, también podemos utilizar strrpos para encontrar la posición de la última aparición de un». » en un nombre de archivo y el incremento de la posición a través de la 1, de modo que se va a explotar la cadena de (.)

    $ext = substr($fileName, strrpos($fileName, '.') + 1);

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

    esta es la mejor manera si tienen nombres de archivo como nombre.nombre.nombre.ext (feo, pero a veces ocurre

  26. -1

    Uso

    str_replace('.', '', strrchr($file_name, '.'))

    para una rápida extensión de recuperación (si está seguro de su nombre de archivo tiene uno).

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea