Как обрезать расширение файла из строки в JavaScript?

Например, предполагая, что 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() является функцией и выполняет проверку символов.

вопрос задан 22.11.2010
ma11hew28
54036 репутация

22 ответов


  • 346 рейтинг

    Не уверен, что будет работать быстрее, но это будет более надежно, когда речь идет о расширении, как .jpeg или .html

    x.replace(/\.[^/.]+$/, "")
    
    ответ дан John Hartsock, с репутацией 63199, 22.11.2010
  • 106 рейтинг

    В узле . js , имя файла без расширения можно получить следующим образом.

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

    Дополнительное объяснение на узле . JS документация стр.

    ответ дан Jibesh Patra, с репутацией 1194, 24.07.2015
  • 101 рейтинг

    x.length-4 учитывает только расширения из 3 символов. Что делать, если у вас есть filename.jpeg или filename.pl?

    РЕДАКТИРОВАТЬ:

    Ответить. , , Конечно, если у вас всегда есть расширение .jpg, x.length-4 будет работать нормально.

    Однако, если вы не знаете длину вашего расширения, любое из ряда решений лучше / надежнее.

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

    ИЛИ

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

    ИЛИ

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

    ИЛИ (при условии, что имя файла имеет только одну точку)

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

    ИЛИ (также только с одной точкой)

    parts = x.split(".");
    x = parts[0];
    
    ответ дан Jeff B, с репутацией 27040, 22.11.2010
  • 88 рейтинг

    Если вы знаете длину расширения, вы можете использовать x.slice(0, -4) (где 4 - это три символа расширения и точка).

    Если вы не знаете длину, регулярное выражение @John Hartsock будет правильным подходом.

    Если вы не хотите использовать регулярные выражения, вы можете попробовать это (менее производительно):

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

    Обратите внимание, что произойдет сбой для файлов без расширения.

    ответ дан Marek Sapota, с репутацией 13761, 22.11.2010
  • 34 рейтинг

    Возможно, вы можете использовать предположение, что последняя точка будет разделителем расширения.

    var x = 'filename.jpg';
    var f = x.substr(0, x.lastIndexOf('.'));
    

    Если файл не имеет расширения, он вернет пустую строку. Чтобы исправить это используйте эту функцию

    function removeExtension(filename){
        var lastDotPosition = filename.lastIndexOf(".");
        if (lastDotPosition === -1) return filename;
        else return filename.substr(0, lastDotPosition);
    }
    
    ответ дан Martin Algesten, с репутацией 8771, 22.11.2010
  • 13 рейтинг

    в узле. JS версии до 0. 12. х:

    path.basename(filename, path.extname(filename))

    Конечно, это также работает в 0. 12. х и позже.

    ответ дан blah238, с репутацией 701, 16.12.2015
  • 10 рейтинг

    Это работает, даже если в строке нет разделителя.

    String.prototype.beforeLastIndex = function (delimiter) {
        return this.split(delimiter).slice(0,-1).join(delimiter) || this + ""
    }
    
    "image".beforeLastIndex(".") // "image"
    "image.jpeg".beforeLastIndex(".") // "image"
    "image.second.jpeg".beforeLastIndex(".") // "image.second"
    "image.second.third.jpeg".beforeLastIndex(".") // "image.second.third"
    

    Может также использоваться как однострочный:

    var filename = "this.is.a.filename.txt";
    console.log(filename.split(".").slice(0,-1).join(".") || filename + "");
    

    РЕДАКТИРОВАТЬ: Это более эффективное решение:

    String.prototype.beforeLastIndex = function (delimiter) {
        return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
    }
    
    ответ дан Andrew Plank, с репутацией 608, 17.09.2014
  • 7 рейтинг

    Мне нравится этот, потому что это один вкладыш, который не слишком трудно читать:

    filename.substring(0, filename.lastIndexOf('.')) || filename
    
    ответ дан Jakub, с репутацией 1009, 23.12.2017
  • 7 рейтинг

    Еще один вкладыш:

    x.split(".").slice(0, -1).join(".")
    
    ответ дан Jacob Bundgaard, с репутацией 650, 8.01.2014
  • 6 рейтинг

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

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

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

    ответ дан Chad Johnson, с репутацией 9559, 29.01.2015
  • 6 рейтинг

    Я не знаю, если это правильный вариант, но я использую это:

    name = filename.split(".");
    // trimming with pop()
    name.pop();
    // getting the name with join()
    name.join(''); // empty string since default separator is ', '
    

    Это не просто одна операция, которую я знаю, но, по крайней мере, она всегда должна работать!

    ответ дан Giacomo Cerquone, с репутацией 919, 29.11.2015
  • 5 рейтинг

    Простой:

    var n = str.lastIndexOf(".");
    return n > -1 ? str.substr(0, n) : str;
    
    ответ дан Dugh, с репутацией 131, 21.06.2016
  • 4 рейтинг

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

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

    var name = "2015-01-01_backup.tar.gz";
    name.replace(/(\.[^/.]+)+$/, "");
    
    ответ дан basic6, с репутацией 2100, 14.02.2015
  • 2 рейтинг

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

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

    ответ дан Munim Dibosh, с репутацией 1777, 5.04.2018
  • 2 рейтинг
    var fileName = "something.extension";
    fileName.slice(0, -path.extname(fileName).length) // === "something"
    
    ответ дан Yas, с репутацией 1316, 19.03.2016
  • 2 рейтинг

    Если вам нужно обработать переменную, которая содержит полный путь (например, : 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);
      
    ответ дан willy wonka, с репутацией 249, 12.10.2016
  • 0 рейтинг

    Здесь регулярные выражения пригодятся! Javascript .replace() метод будет принимать регулярное выражение, и вы можете использовать это для достижения того, что вы хотите:

    // assuming var x = filename.jpg or some extension
    x = x.replace(/(.*)\.[^.]+$/, "$1");
    
    ответ дан Alex, с репутацией 40604, 22.11.2010
  • 0 рейтинг
    x.slice(0, -(x.split('.').pop().length + 1));
    
    ответ дан ishandutta2007, с репутацией 3918, 25.11.2017
  • 0 рейтинг

    Вы можете использовать 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'
    
    ответ дан Alan Dong, с репутацией 2116, 30.04.2016
  • 0 рейтинг

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

        yourStr = yourStr.slice(0, -4); // 'test'
    
    ответ дан SorinN, с репутацией 169, 16.08.2014
  • 0 рейтинг

    Это код, который я использую для удаления расширения из имени файла, без использования регулярных выражений или indexOf (indexOf не поддерживается в IE8). Предполагается, что расширением является любой текст после последнего '. ' персонаж.

    Работает для:

    • файлы без расширения: «myletter»
    • файлов с '. 'во имя: "мой. письмо. TXT "
    • неизвестна длина расширения файла: «мой. письмо. HTML

    Вот код:

    var filename = "my.letter.txt" // some filename
    
    var substrings = filename.split('.'); // split the string at '.'
    if (substrings.length == 1)
    {
      return filename; // there was no file extension, file was something like 'myfile'
    }
    else
    {
      var ext = substrings.pop(); // remove the last element
      var name = substrings.join(""); // rejoin the remaining elements without separator
      name = ([name, ext]).join("."); // readd the extension
      return name;
    }
    
    ответ дан Little Brain, с репутацией 349, 11.11.2015
  • -1 рейтинг

    Я бы использовал что-то вроде х. подстрока (0, х. LastIndexOf (». «)). Если вы стремитесь к производительности, вообще не используйте javascript :-p Нет, еще одно утверждение не имеет значения для 99. 99999% всех целей.

    ответ дан Lucas Moeskops, с репутацией 4504, 22.11.2010