Как обрезать расширение файла из строки в 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или.htmlx.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 + "" }
Мне нравится этот один, потому что это один лайнер, который не слишком трудно читать:
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 ', 'Это не просто одна операция, которую я знаю, но, по крайней мере, он должен всегда работать!
принятый ответ удаляет только последнюю часть расширения (
.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", то же, что и выше;
Примечания:
- первый немного медленнее причина выполняет больше операций, но работает в обоих случаях, другими словами он может извлечь имя файла без расширения из заданной строки, содержащей путь или имя файла с ex. В то время как второй работает только в том случае, если данная переменная содержит имя файла с ext как filename.доб, но немного быстрее.
- оба решения работают как для локальных, так и для серверных файлов;
но я ничего не могу сказать ни о сравнении производительности с другими ответами, ни о совместимости браузера или ОС.
рабочий фрагмент 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'
это код, который я использую для удаления расширения из имени файла, без использования 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