Cómo eliminar la extensión de la cadena (¡solo una extensión real!)

135

Estoy buscando una pequeña función que me permita eliminar la extensión de un nombre de archivo.

He encontrado muchos ejemplos buscando en Google, pero son malos, porque simplemente eliminan parte de la cadena con "." . Usan punto para limitar y simplemente cortan la cuerda.

Mira estos guiones,

$from = preg_replace('/\.[^.]+$/','',$from);

o

 $from=substr($from, 0, (strlen ($from)) - (strlen (strrchr($filename,'.'))));

Cuando agregamos la cadena de esta manera:

Este es un ejemplo de somestring

Solo devolverá "Esto" ...

La extensión puede tener 3 o 4 caracteres, por lo que debemos verificar si el punto está en la posición 4 o 5 y luego eliminarlo.

¿Cómo puede hacerse esto?

bagazo
fuente
1
¿Qué es una extensión "real"? ¿Desea eliminar los últimos 4 o caracteres si están precedidos por un punto?
clyfe
"Col. Shrapnel": está diseñado para usuarios de Windows. "clyfe": sí, quiero eliminar todo después del punto, pero solo si está en la posición 4 o 5, lo que representará ".jpeg" o ".mp3". Solo no quiero eliminarlo. Sé que puedo hacerlo manualmente usando str-pos y cortar string usando la instrucción if (si 5 pos = punto, luego cortar (rtrim) desde la derecha 5 caracteres, si 4 pos = punto, entonces rtrim 4, de lo contrario, volver sin ninguna modificación. Pero tal vez es la solución más rápida.
Marc
3
¿Qué pasa con los archivos .package? ¿O unidad? Parece un poco arbitrario restringir una extensión a 4 caracteres.
rdb

Respuestas:

172

Prueba este:

$withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename);

Entonces, esto coincide con un punto seguido de tres o cuatro caracteres que no son un punto o un espacio. La regla "3 o 4" probablemente debería ser relajada, ya que hay muchas extensiones de archivo que son más cortas o más largas.

nickf
fuente
el problema es que también hay personas que renombran archivos como:20120720.something.somethingelse.jpg
Obmerk Kronen
3
No creo que esto funcione con archivos con dos caracteres como extensión
NaturalBornCamper
1
ty! tenga en cuenta que debe usar comillas simples si no realiza una sustitución de variables, por ejemplo"$var"
aelgoa
bueno, para usarlo con archivos .py, supongo que debes agregar 2,3,4 en lugar de solo 3,4:> ¡gracias!
voghDev
2
@voghDev para admitir extensiones con 2 a 4 caracteres que debe agregar en {2,4}lugar de{3,4}
Timo Huovinen
81

Del manual, pathinfo :

<?php
    $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"; // Since PHP 5.2.0
?>

No tiene que ser una ruta completa para funcionar correctamente. Se analizará tan felizmente file.jpgcomo /path/to/my/file.jpg.

Erik
fuente
Ya revisé esto. El mismo error que el anterior. Intente acceder a "$ path_parts ['filename']" desde T.sec - "xxx" 23 12 32 3 a twym2. Solo devolverá T. ¡Del ejemplo anterior no debería eliminar nada!
Marc
56

Utilice PHP basename ()

(PHP 4, PHP 5)

var_dump(basename('test.php', '.php'));

Salidas: cadena (4) "prueba"

Lamy
fuente
2
+1 Si los requisitos mencionados para una extensión no fueran estrictos, esta sería la respuesta perfecta.
Kayla
1
Mirando los commits en php.net, existe una idea sobre cómo trabajar con una matriz ... que creo que podría mejorarse usando algo como array-walk
CrandellWS
35

Esta es una solución bastante fácil y funcionará sin importar cuánto tiempo la extensión o cuántos puntos u otros caracteres hay en la cadena.

$filename = "abc.def.jpg";

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

//$newFileName will now be abc.def

Básicamente, esto solo busca la última aparición de. y luego usa la subcadena para recuperar todos los caracteres hasta ese punto.

Es similar a uno de sus ejemplos en Google pero más simple, más rápido y más fácil que las expresiones regulares y los otros ejemplos. Bueno, de todos modos. Espero que ayude a alguien.

wprenison
fuente
2
Sé que esto llegará demasiado tarde, pero creo que esta es la mejor respuesta. Funciona genial.
Agbogidi Michael
esto no funcionará para archivos ocultos * nix sin extensión, por ejemplo,.htaccess
Fr0zenFyr
12

Podría usar lo que PHP ha incorporado para ayudar ...

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . '/' . pathinfo($path, PATHINFO_FILENAME);

Aunque si solo está tratando con un nombre de archivo ( .somefile.jpg), obtendrá ...

./somefile

Véalo en CodePad.org

O usa una expresión regular ...

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), '/') . '$/', '', $path);

Véalo en CodePad.org

Si no tiene una ruta, sino solo un nombre de archivo, esto funcionará y será mucho más terser ...

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

Véalo en CodePad.org

Por supuesto, estos dos solo buscan el último período ( .).

alex
fuente
Como se mencionó en la última línea de solución, fallará para nombres de archivo como.htaccess
Fr0zenFyr
8

El siguiente código funciona bien para mí, y es bastante corto. Simplemente divide el archivo en una matriz delimitada por puntos, elimina el último elemento (que hipotéticamente es la extensión) y vuelve a reformar la matriz con los puntos.

$filebroken = explode( '.', $filename);
$extension = array_pop($filebroken);
$fileTypeless = implode('.', $filebroken);
Emanegux
fuente
devolverá falso si el archivo no tiene extensión o vacío si el archivo es.htaccess
Timo Huovinen
5

Encontré muchos ejemplos en Google, pero hay algunos malos porque simplemente elimine parte de la cadena con "."

En realidad eso es absolutamente lo correcto. Adelante, usa eso.

La extensión del archivo lo es todo después del último punto, y no hay ningún requisito para que una extensión de archivo tenga un número particular de caracteres. Incluso hablando solo de Windows, ya viene con extensiones de archivo que no se ajustan a 3-4 caracteres, como por ejemplo. .manifest.

bobince
fuente
2
..y no lo olvidemos .htaccessy .htpasswden entornos apache.
h2ooooooo
5

Uso recomendado: pathinfo con PATHINFO_FILENAME

$filename = 'abc_123_filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);
Alex
fuente
4

Hay algunas formas de hacerlo, pero creo que una de las formas más rápidas es la siguiente

// $filename has the file name you have under the picture
$temp = explode( '.', $filename );
$ext = array_pop( $temp );
$name = implode( '.', $temp );

Otra solución es esta. No lo he probado, pero parece que debería funcionar durante varios períodos en un nombre de archivo

$name = substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

También:

$info = pathinfo( $filename );
$name = $info['filename'];
$ext  = $info['extension'];

// Or in PHP 5.4, i believe this should work
$name = pathinfo( $filename )[ 'filename' ];

En todos estos, $namecontiene el nombre de archivo sin la extensión

Ascherer
fuente
4
$image_name = "this-is.file.name.jpg";
$last_dot_index = strrpos($image_name, ".");
$without_extention = substr($image_name, 0, $last_dot_index);

Salida:

this-is.file.name
Abhishek
fuente
1
$the_extension = substr($image_name, $last_dot_index, $last_dot_index);Agregue eso para obtener la extensión del archivo.
I_ATE_YOUR_WORK_FILES
2

Como otros mencionan, la idea de limitar la extensión a un cierto número de caracteres no es válida. Siguiendo la idea de array_pop, pensando en una cadena delimitada como una matriz, esta función me ha sido útil ...

function string_pop($string, $delimiter){
    $a = explode($delimiter, $string);
    array_pop($a);
    return implode($delimiter, $a);
}

Uso:

$filename = "pic.of.my.house.jpeg";
$name = string_pop($filename, '.');
echo $name;

Salidas:

pic.of.my.house  (note it leaves valid, non-extension "." characters alone)

En acción:

http://sandbox.onlinephpfunctions.com/code/5d12a96ea548f696bd097e2986b22de7628314a0

jbobbins
fuente
1

Puede establecer la longitud del patrón de expresión regular utilizando el {x,y}operador. {3,4}coincidiría si el patrón anterior ocurre 3 o 4 veces.

Pero no creo que realmente lo necesites. ¿Qué harás con un archivo llamado "This.is"?

Su sentido común
fuente
0

Utilizar este:

strstr('filename.ext','.',true);
//result filename
Shintadoniku Alyssa
fuente
Esto solo funciona si el nombre de archivo aún no tiene un punto. PHP Docs menciona la primera aparición de aguja
relipse
0

Intenta usar este. seguramente eliminará la extensión del archivo.

$filename = "image.jpg";
$e = explode(".", $filename);
foreach($e as $key=>$d)
{
if($d!=end($e)
{

$new_d[]=$d; 
}

 }
 echo implode("-",$new_t);  // result would be just the 'image'
Gilbert Aldava
fuente
Puede reducir esto a una línea con array_pop ()
Peter Brand
0

EDITAR : El enfoque más inteligente en mi humilde opinión, elimina el último punto y el siguiente texto de un nombre de archivo (también conocido como la extensión):

$name = basename($filename, '.' . end(explode('.', $filename)));

Salud ;)

andcl
fuente
Si bien podría funcionar, end()no se supone que funcione con una función pasada como parámetro. También produce un aviso: solo las variables deben pasarse por referencia
CodeBrauer
0

Esto funciona cuando hay múltiples partes en una extensión y es breve y eficiente:

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