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

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

Я видел x.substring(0, x.indexOf('.jpg')) on DZone Фрагменты, а не x.substring(0, x.length-4) лучше? Так, length - это свойство, а не характер проверки, а indexOf() - это функция, а не персонаж.

22 ответов


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

Если вы не знаете длину @John hartsock regex будет правильным подходом.

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

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

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


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

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

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

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

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

дальнейшее объяснение в узел.js документация страница.


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(/(.*)\.(.*?)$/, "");

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

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

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

parts = x.split(".");
x = parts[0];

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

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

В Узел.версии js до 0.12.x:

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

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


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

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 + ""
}

еще один-лайнер:

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

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

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

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

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

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


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

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

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


просто:

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

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

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

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

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

Если вам нужно обработать переменную, содержащую полный путь (например.: 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()

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

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

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

Примечания:

  1. первый немного медленнее, потому что выполняет больше операций, но работает в обоих случаях, другими словами он может извлечь имя файла без расширения из заданной строки, содержащей путь или имя файла с ex. В то время как второй работает только в том случае, если данная переменная содержит имя файла с ext like 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);
  

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

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


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

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

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

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

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

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

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

это работает:

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

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