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

1126   22  

22 ответов:

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

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

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

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

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

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

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

In узел.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()

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

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

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

Примечания:

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

хотя это довольно поздно, я добавлю еще один подход, чтобы получить имя файла без расширения, используя старый добрый ИС-

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.substring(0, x.lastIndexOf('.')). Если вы собираетесь для производительности, не идите на javascript вообще :-p нет, еще один оператор действительно не имеет значения для 99.99999% всех целей.

Comments

    Ничего не найдено.