Cómo eliminar la extensión del nombre del archivo (¡solo la extensión real!) [duplicate]

5 minutos de lectura

avatar de usuario de marc
bagazo

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 limitador 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 como esta:

Este es un ejemplo de una cadena

Devolverá sólo “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?

  • ¿Qué es una extensión “real”? ¿Desea eliminar los últimos 4 o menos caracteres si están precedidos por un punto?

    – clyfe

    7 de marzo de 2010 a las 10:18

  • “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”. Simplemente no quiero eliminarlo. Sé que puedo hacerlo manualmente usando str-pos y cortar la cadena usando la instrucción if (si 5 pos = punto, luego corte (rtrim) de los 5 caracteres correctos, si 4 pos = punto, entonces rtrim 4, de lo contrario regrese sin ninguna modificación. Pero tal vez es una solución más rápida.

    – marc

    7 de marzo de 2010 a las 10:30

  • ¿Qué pasa con los archivos .package? ¿O .unidad? Parece un poco arbitrario restringir una extensión a 4 caracteres.

    – rdb

    16 de septiembre de 2016 a las 0:03

  • Si marc vuelve, espero que cambie la respuesta aceptada.

    – HoldOffHunger

    7 de enero de 2022 a las 2:24

Avatar de usuario de Timo Huovinen
Timo Huovinen

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

pathinfo — Devuelve información sobre la ruta de un archivo

$filename = pathinfo('filename.md.txt', PATHINFO_FILENAME); // returns 'filename.md'

avatar de usuario de nickf
apodo

Prueba este:

$withoutExt = preg_replace('/\.\w+$/', '', $filename);

Entonces, esto coincide con un punto seguido de caracteres de palabras ([a-zA-Z0-9_]) que no son un punto o un espacio.

  • el problema es que también hay gente que renombra archivos como:20120720.something.somethingelse.jpg

    – Obmerk Kronen

    22 de julio de 2012 a las 3:27

  • No creo que esto funcione con archivos con dos caracteres como extensión

    – NaturalBornCamper

    23 de agosto de 2012 a las 19:18

  • ty! tenga en cuenta que debe usar comillas simples si no realiza la sustitución de variables, por ejemplo "$var"

    – aelgoa

    29/10/2013 a las 18:20

  • bueno, para usarlo con archivos .py supongo que tienes que agregar 2,3,4 en lugar de solo 3,4 :> ¡gracias!

    – voghDev

    13 de junio de 2014 a las 10:49

  • @voghDev para admitir extensiones con 2 a 4 caracteres que debe agregar {2,4} en lugar de {3,4}

    – Timo Huovinen

    19 de junio de 2014 a las 6:37

Avatar de usuario de Erik
erik

Del manual, información de ruta:

<?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. Analizará felizmente file.jpg como /path/to/my/file.jpg.

  • Ya comprobé esto. Mismo error que el anterior. Intente acceder a “$path_parts[‘filename’]” from T.sec – “xxx” 23 12 32 3 a twym2 Devolverá solo T. En el ejemplo anterior, ¡no debería eliminar nada!

    – marc

    7 de marzo de 2010 a las 10:26

Usar nombre base de PHP()

(PHP 4, PHP 5)

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

Salidas: cadena (4) “prueba”

avatar de usuario de wprenison
wprenison

Esta es una solución bastante fácil y funcionará sin importar la extensión o la cantidad de puntos u otros caracteres 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 subcadena para recuperar todos los caracteres hasta ese punto.

Es similar a uno de sus ejemplos buscados 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.

  • Sé que esto llega demasiado tarde, pero creo que esta es la mejor respuesta. Funciona genial.

    – Agbogidi Michael

    29 de junio de 2017 a las 21:03

  • esto no funcionará para *nix archivos ocultos sin extensión, por ejemplo, .htaccess

    – FrozenFyr

    3 de julio de 2019 a las 6:29

Avatar de usuario de Alex
Alex

Recomendar uso: pathinfo con PATHINFO_FILENAME

$filename="abc_123_filename.html";
$without_extension = pathinfo($filename, PATHINFO_FILENAME);

  • Sé que esto llega demasiado tarde, pero creo que esta es la mejor respuesta. Funciona genial.

    – Agbogidi Michael

    29 de junio de 2017 a las 21:03

  • esto no funcionará para *nix archivos ocultos sin extensión, por ejemplo, .htaccess

    – FrozenFyr

    3 de julio de 2019 a las 6:29

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

$withoutExt = pathinfo($path, PATHINFO_DIRNAME) . "https://stackoverflow.com/" . pathinfo($path, PATHINFO_FILENAME);

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

./algunarchivo

Véalo en CodePad.org

O usa una expresión regular…

$withoutExt = preg_replace('/\.' . preg_quote(pathinfo($path, PATHINFO_EXTENSION), "https://stackoverflow.com/") . '$/', '', $path);

Véalo en CodePad.org

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

$withoutExt = pathinfo($path, PATHINFO_FILENAME);

Véalo en CodePad.org

Por supuesto, estos dos solo buscan el último punto (.).

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

    – FrozenFyr

    3 de julio de 2019 a las 6:31

¿Ha sido útil esta solución?