Как обрезать расширение файла из строки в 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% всех целей.