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