Как обрезать расширение файла из строки в 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() является функцией и выполняет проверку символов.

Ответ 1

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

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

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

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

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

Ответ 2

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

x.replace(/\.[^/.]+$/, "")

Ответ 3

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

const path = require('path');
var filename = 'hello.html';

path.parse(filename).name; // hello
path.parse(filename).ext;  // .html

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

Ответ 4

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

EDIT:

Чтобы ответить... конечно, если у вас всегда есть расширение .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];

Ответ 5

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

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);
}

Ответ 6

В версиях Node.js до 0.12.x:

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

Конечно, это также работает в 0.12.x и позже.

Ответ 7

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

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 + "");

EDIT: это более эффективное решение:

String.prototype.beforeLastIndex = function (delimiter) {
    return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
}

Ответ 8

Другой однострочный:

x.split(".").slice(0, -1).join(".")

Ответ 9

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

filename.substring(0, filename.lastIndexOf('.')) || filename

Ответ 10

Здесь другое решение на основе регулярных выражений:

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

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

Ответ 11

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

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

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

Ответ 12

Простой:

var n = str.lastIndexOf(".");
return n > -1 ? str.substr(0, n) : str;

Ответ 13

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

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

var name = "2015-01-01_backup.tar.gz";
name.replace(/(\.[^/.]+)+$/, "");

Ответ 14

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

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

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

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

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

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

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

Примечания:

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

Но я не могу сказать ничего об одном сравнении производительности с другими ответами, а также совместимости с браузером и ОС.

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

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

Ответ 15

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

const path = require('path')

path.basename('test.txt', path.extname('test.txt'))

Ответ 16

var fileName = "something.extension";
fileName.slice(0, -path.extname(fileName).length) // === "something"

Ответ 17

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

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

Ответ 18

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

// assuming var x = filename.jpg or some extension
x = x.replace(/(.*)\.[^.]+$/, "$1");

Ответ 19

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

    yourStr = yourStr.slice(0, -4); // 'test'

Ответ 20

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

Он работает для:

  • файлы без расширения: "myletter"
  • файлы с. в названии: "my.letter.txt"
  • неизвестная длина расширения файла: "my.letter.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;
}

Ответ 21

Вы можете использовать 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'

Ответ 22

x.slice(0, -(x.split('.').pop().length + 1));

Ответ 23

Сначала вы должны получить правильное расширение файла, затем вы можете удалить его

попробуй этот код

<!DOCTYPE html>
<html>
<body>
<p>Click the button to display the array values after the split.</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
<script>
function getFileName(str){
    var res = str.split('.').pop();
    alert('filename: ' + str.replace('.' + res, ''));
    alert('extension: ' +res);
}
function myFunction() {
    getFileName('abc.jpg');
    getFileName('abc.def.jpg');
    getFileName('abc.def.ghi.jpg');
    getFileName('abc.def.ghi.123.jpg');
    getFileName('abc.def.ghi.123.456.jpg');
    getFileName('abc.jpg.xyz.jpg'); // test with Sébastien comment lol
}
</script>
</body>
</html>

Ответ 24

Я бы использовал что-то вроде x.substring(0, x.lastIndexOf('.')). Если вы собираетесь работать, не идите на javascript вообще: -p Нет, еще одно утверждение действительно не имеет значения для 99.99999% всех целей.