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.

Mostafa Elkady
fuente

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
Tecnología
fuente
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.

Gordon
fuente
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

yckart
fuente
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.

caiosm1005
fuente
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

anydasa
fuente
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));
fuego
fuente
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.

Rohan Khude
fuente
7

No hay necesidad de escribir mucho código. Incluso se puede hacer con una sola línea de código. Ver aquí

A continuación se muestra el código de una línea que solo devuelve el nombre del archivo y elimina el nombre de la extensión:

<?php
 echo pathinfo('logo.png')['filename'];
?>

Imprimirá

logo

Fuente: eliminar la extensión y devolver solo el nombre del archivo en PHP

Faruque Ahamed Mollick
fuente
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"
NSINE
fuente
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.
Hoàng Vũ Tgtt
fuente
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.

Jitendra Pawar
fuente
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
marioviales
fuente
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, "."));

usuario2047861
fuente
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"
Ghanshyam Gohel
fuente
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");
?>
shaz3e
fuente
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
Dan Bray
fuente
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"
Vincenzo Ruffa
fuente