PHP, obtener el nombre del archivo sin extensión de archivo


205

Tengo este código PHP:

function ShowFileExtension($filepath)
{
    preg_match('/[^?]*/', $filepath, $matches);
    $string = $matches[0];

    $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);

    if(count($pattern) > 1)
    {
        $filenamepart = $pattern[count($pattern)-1][0];
        preg_match('/[^?]*/', $filenamepart, $matches);
        return strtolower($matches[0]);
    }
}

Si tengo un archivo llamado my.zip, esta función vuelve .zip.

Quiero hacer lo contrario, quiero que la función regrese mysin la extensión.

El archivo es solo una cadena en una variable.


Respuestas:


398

No hay necesidad de todo eso. Echa un vistazo a pathinfo () , te da todos los componentes de tu ruta.

Ejemplo del manual:

$path_parts = pathinfo('/www/htdocs/index.html');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // filename is only since PHP 5.2.0

Salida del código:

/www/htdocs
index.html
html
index

Y, alternativamente, solo puede obtener ciertas partes como:

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html

3
¿Por qué se rechazó esto? La respuesta es absolutamente correcta. pathinfo funciona con cadenas, por lo que no importa si el archivo está realmente en el servidor o no.
Gordon

13
Es desafortunado que nombraron mal "basename", ya que devuelve el nombre de archivo completo con la extensión, no el nombre base.
Oscar

1
@Oscar es el significado más ampliamente entendido del término basename. Sin engaños.
nawfal

1
Esto es muy útil, especialmente cuando no necesita conocer la extensión del archivo para extraerlo.
Vahid Amiri

Esta es una solución extremadamente elegante. Prestigio. Esto debe marcarse como la respuesta correcta.
Native Coder

199

Como alternativa a pathinfo(), puede usar

  • basename() - Devuelve el componente del nombre de archivo de la ruta

Ejemplo del manual de PHP

$path = "/home/httpd/html/index.php";
$file = basename($path);         // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"

Sin embargo, debe conocer la extensión para eliminarla de antemano.

Sin embargo, dado que su pregunta sugiere que tiene la necesidad de obtener la extensión y el nombre base, votaría la respuesta de Pekka como la más útil, porque le dará cualquier información que desee sobre la ruta y el archivo con un único nativo función.


1
¿Qué pasa si no sé acerca de la extensión de archivo ... digamos que si la ruta es dinámica cualquier tipo de extensión de archivo puede entrar! y que ??
user889030

@ user889030, entonces tiene un escenario diferente al OP y no lo usa basename, pero pathinfocomo se muestra en la página.
Gordon

72

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

pathinfo($path, PATHINFO_FILENAME);

Prueba funcional simple: https://ideone.com/POhIDC


Esto devolvería el nombre del archivo con la extensión
user966939

2
@ user966939 Mhh, no con extensión es basename;-)
yckart

Bueno, de cualquier manera, él estaba pidiendo una solución SIN extensión. ;)
user966939

2
@ user966939, Amigo, no hay ninguna extensión. Es PATHINFO_FILENAME, no PATHINFO_EXTENSION ...
Pacerier

20
Quien decidido que filenameno tiene una extensión mientras se basenamehace debe tener algunas tendencias sádicas ...
Marcos

12

Otro enfoque es mediante el uso de expresiones regulares.

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);

Esto elimina desde el último período .hasta el final de la cadena.


Me gusta esta respuesta, muy simple y funciona cuando no conoces la extensión.
relipse

Mucho mejor que usar explotar, y solo captura la sección del último período en caso de que haya usado puntos en los nombres de archivo
Kiwizoom

77
No , es mucho, mucho peor. Deja de regexing personas.
Pacerier

Gracias, y los comentarios anteriores lo clavaron. No tener que saber la extensión hace que esto sea más útil.
James Taylor

1
@ caiosm1005, La superficie de ataque aumenta de inmediato porque es difícil razonar contra las partes internas de un motor de expresiones regulares. Por ejemplo, en el código anterior, no sería extraño si hay alguna entrada $fileNameque podría hacer que el motor funcione en un tiempo exponencial (o peor). Y suponiendo que hayamos terminado de diseccionar las partes internas de este motor regex específico y teóricamente hayamos demostrado que es robusto contra todos los valores posibles $fileName, el código aún no es arbitrariamente portátil a otra plataforma que tenga otra implementación del motor regex.
Pacerier

12

Si no se conoce la extensión, use esta solución

 pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname"

 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"

PHP MAN función pathinfo


Proporcione un me gusta a la página de manual de php para pathinfo. Esto ayudará a OP a mejorar el ShowFileExtensionmétodo y proporcionará una lectura adicional para cualquiera que intente encontrar esta respuesta. También una pequeña descripción no se perdería ...
Michael Coxon

1
Ya he respondido esta pregunta con la misma solución, ~ 2 años antes que la tuya;)
yckart

@yckart es cierto, pero esto da múltiples ejemplos dentro de la respuesta. El suyo tiene el beneficio de vincularse a ideone.com, pero el sitio podría quedar desconectado.
Adam Elsodaney

7

@Gordon basename funcionará bien si conoce la extensión, si no puede usar explotar:

$filename = end(explode(".", $file));

1
Por favor, envíeme comentarios con la función de comentarios debajo de mi respuesta. La función más apropiada para esto es pathinfo, por eso di solo basenamecomo alternativa. No hay necesidad de reinventar pathinfocon regex o explode.
Gordon

44
@fire, su actualización no tiene sentido. end(explode(".", $file));le da la extensión, no el nombre del archivo.
Pacerier

7

Casi todas las soluciones anteriores tienen el nombre de archivo que se muestra de la variable $ path

El siguiente fragmento obtendrá el nombre del archivo ejecutado actual sin extensión

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);

Explicación

$ _SERVER ['SCRIPT_NAME'] contiene la ruta del script actual.



4

@fire en caso de que el nombre de archivo use puntos, podría obtener un resultado incorrecto. Usaría el método @Gordon pero también obtendría la extensión, por lo que la función basename funciona con todas las extensiones, como esta:

$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);

$file = basename($path, ".".$ext); // $file is set to "index"

4

en mi caso, lo uso a continuación. No me importa cuál es su extensión. : D creo que te ayudará

$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.

Por cierto: tienes un error tipográfico$extenion
Thomas Kekeisen

2

Puedes escribir esto

$filename = current(explode(".", $file));

Estos devolverán el elemento actual de la matriz, si no se usó antes.


Hola, por favor, compruebe antes de degradarlo. Está funcionando. Lo había usado en mi código muchas veces. Al usar esta función, puede obtener solo un nombre de archivo Si el nombre de archivo es "xyz.jpg". Es posible que no funcione con nombres de archivo que contengan la ruta completa.
Jitendra Pawar

Esto tampoco funciona correctamente si un nombre de archivo tiene varios puntos, por ejemplo, "some.interesting.image.jpg"
ganzpopp

2

Corto

echo pathinfo(__FILE__)['filename']; // since php 5.2

bueno. Pero si puse el código anterior b.phpy ejecuté a.phptener require('b.php'). Luego, la salida será cómo en blugar dea
Rohan Khude

1

Nombre de archivo sin extensión de archivo cuando no conoce esa extensión:

$basename = substr($filename, 0, strrpos($filename, "."));


2
¿Qué tal si la extensión es algo como .tar.gz?
Arda

1

Si no sabe qué extensión tiene, puede probar esto:

$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only

Trabajando con todas las posibilidades:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"

1

Su respuesta está debajo de la solución perfecta para ocultar la extensión de archivo en php.

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>

1

Las soluciones existentes fallan cuando hay varias partes en una extensión. La siguiente función funciona para varias partes, una ruta completa o simplemente un nombre de archivo:

function removeExt($path)
{
    $basename = basename($path);
    return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file

0

Este solo devuelve el nombre de archivo sin ninguna extensión en 1 fila:

$path = "/etc/sudoers.php";    
print array_shift(explode(".", basename($path)));
// will print "sudoers"

$file = "file_name.php";    
print array_shift(explode(".", basename($file)));
// will print "file_name"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.