Как обрезать расширение файла из строки в JavaScript? - PullRequest
246 голосов
/ 23 ноября 2010

Например, предполагая, что x = filename.jpg, я хочу получить filename, где filename может быть любым именем файла (Предположим, что имя файла содержит только [a-zA-Z0-9-_] для упрощения.).

Я видел x.substring(0, x.indexOf('.jpg')) на DZone Snippets , но не будет ли x.substring(0, x.length-4) работать лучше?Потому что length является свойством и не выполняет проверку символов, тогда как indexOf() является функцией и выполняет проверку символов.

Ответы [ 24 ]

7 голосов
/ 06 ноября 2018

Это также можно легко сделать с помощью пути, используя методы basename и extname.

const path = require('path')

path.basename('test.txt', path.extname('test.txt'))
6 голосов
/ 30 января 2015

Вот еще одно решение на основе регулярных выражений:

filename.replace(/\.[^.$]+$/, '');

Это должно отрубить только последний сегмент.

5 голосов
/ 21 июня 2016

Простой:

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;
5 голосов
/ 14 февраля 2015

Принятый ответ удаляет только последнюю часть расширения (.jpeg), что может быть хорошим выбором в большинстве случаев.

Однажды мне пришлось удалить все расширения (.tar.gz), и имена файлов были ограничены, чтобы не содержать точек (поэтому 2015-01-01.backup.tar не будет проблемой):

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");
3 голосов
/ 12 октября 2016

Если вам нужно обработать переменную, которая содержит полный путь (например: thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg"), и вы хотите вернуть просто «имя файла», вы можете использовать:

theName = thePath.split("/").slice(-1).join().split(".").shift();

результат будет theName == "filename" ;

Чтобы попробовать это, введите следующую команду в окне консоли вашего отладчика Chrome: window.location.pathname.split("/").slice(-1).join().split(".").shift()

Есливам нужно обработать только имя файла и его расширение (например: theNameWithExt = "filename.jpg"):

theName = theNameWithExt.split(".").shift();

результат будет theName == "filename" , как указано выше;

Примечания:

  1. Первый немного медленнее, потому что выполняет больше операций;но работает в обоих случаях, другими словами, он может извлечь имя файла без расширения из заданной строки, содержащей путь или имя файла с помощью ex.В то время как вторая работает, только если данная переменная содержит имя файла с ext, например, filename.ext, но немного быстрее.
  2. Оба решения работают как для локальных файлов, так и для файлов сервера;Но я не могу ничего сказать ни о сравнении производительности с другими ответами, ни о совместимости браузера или ОС.

    рабочий фрагмент 1: полный путь

    var thePath = "http://stackoverflow.com/directory/subdirectory/filename.jpg";
    theName = thePath.split("/").slice(-1).join().split(".").shift();
    alert(theName);
      

    рабочий фрагмент 2: имя файла с расширением

    var theNameWithExt = "filename.jpg";
    theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
    alert(theName);
      

    рабочий фрагмент 2: имя файла с двойным расширением

    var theNameWithExt = "filename.tar.gz";
    theName = theNameWithExt.split("/").slice(-1).join().split(".").shift();
    alert(theName);
      
2 голосов
/ 05 апреля 2018

Хотя уже довольно поздно, я добавлю другой подход, чтобы получить имя файла без расширения, используя простой старый JS-

path.replace(path.substr(path.lastIndexOf('.')), '')

2 голосов
/ 19 марта 2016
var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"
0 голосов
/ 16 августа 2014

Еще один лайнер - мы предполагаем, что наш файл - изображение jpg >> ex: var yourStr = 'test.jpg';

    yourStr = yourStr.slice(0, -4); // 'test'
0 голосов
/ 25 ноября 2017
x.slice(0, -(x.split('.').pop().length + 1));
0 голосов
/ 30 апреля 2016

Вы можете использовать path для маневра.

var MYPATH = '/User/HELLO/WORLD/FILENAME.js';
var MYEXT = '.js';
var fileName = path.basename(MYPATH, MYEXT);
var filePath = path.dirname(MYPATH) + '/' + fileName;

Выход

> filePath
'/User/HELLO/WORLD/FILENAME'
> fileName
'FILENAME'
> MYPATH
'/User/HELLO/WORLD/FILENAME.js'
...