¿Cómo recortar una extensión de archivo de una cadena en JavaScript?

Resuelto ma11hew28 asked hace 13 años • 28 respuestas

Por ejemplo, suponiendo que x = filename.jpgquiero obtener filenamedónde filenamepodría estar cualquier nombre de archivo (supongamos que el nombre del archivo solo contiene [a-zA-Z0-9-_] para simplificar).

Lo vi x.substring(0, x.indexOf('.jpg'))en DZone Snippets , pero ¿no x.substring(0, x.length-4)funcionaría mejor? Porque lengthes una propiedad y no verifica los caracteres, mientras que indexOf()es una función y verifica los caracteres.

ma11hew28 avatar Nov 23 '10 04:11 ma11hew28
Aceptado

No estoy seguro de qué funcionaría más rápido, pero sería más confiable cuando se trata de extensiones como .jpego.html

x.replace(/\.[^/.]+$/, "")
John Hartsock avatar Nov 22 '2010 21:11 John Hartsock

En node.js , el nombre del archivo sin extensión se puede obtener de la siguiente manera.

const path = require('path');
const filename = 'hello.html';
    
path.parse(filename).name;     //=> "hello"
path.parse(filename).ext;      //=> ".html"
path.parse(filename).base; //=> "hello.html"

Explicación adicional en la página de documentación de Node.js.

Jibesh Patra avatar Jul 24 '2015 16:07 Jibesh Patra

Si conoce la longitud de la extensión, puede usar x.slice(0, -4)(donde 4 son los tres caracteres de la extensión y el punto).

Si no conoce la longitud, la expresión regular @John Hartsock sería el enfoque correcto.

Si prefiere no utilizar expresiones regulares, puede probar esto (menos eficaz):

filename.split('.').slice(0, -1).join('.')

Tenga en cuenta que fallará en archivos sin extensión.

Marek Sapota avatar Nov 22 '2010 21:11 Marek Sapota

x.length-4Sólo tiene en cuenta extensiones de 3 caracteres. ¿Qué pasa si tienes filename.jpego filename.pl?

EDITAR:

Para responder... claro, si siempre tienes una extensión de .jpg, x.length-4funcionaría bien.

Sin embargo, si no conoce la duración de su extensión, cualquiera de varias soluciones es mejor o más sólida.

x = x.replace(/\..+$/, '');

O

x = x.substring(0, x.lastIndexOf('.'));

O

x = x.replace(/(.*)\.(.*?)$/, "$1");

O (asumiendo que el nombre del archivo solo tiene un punto)

parts = x.match(/[^\.]+/);
x = parts[0];

O (también con un solo punto)

parts = x.split(".");
x = parts[0];
Jeff B avatar Nov 22 '2010 21:11 Jeff B

Me gusta este porque es de una sola línea y no es demasiado difícil de leer:

filename.substring(0, filename.lastIndexOf('.')) || filename
jakubiszon avatar Dec 23 '2017 23:12 jakubiszon