Вопрос

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

я видел x.substring(0, x.indexOf('.jpg')) на Дзоновые фрагменты, но не будет x.substring(0, x.length-4) Выполните лучше? Потому что, length это имущество и не делает проверку персонажа, тогда как indexOf() является функцией и проверяет персонаж.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

x.length-4 только учетные записи для расширений из 3 символов. Что делать, если у вас есть filename.jpegили filename.pl?

РЕДАКТИРОВАТЬ:

Ответить ... конечно, если у вас всегда есть расширение .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];

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

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

В Node.js версии до 0.12.x:

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

Конечно, это также работает в 0.12.x, а затем.

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

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 + "");

Редактировать: Это более эффективное решение:

String.prototype.beforeLastIndex = function (delimiter) {
    return this.substr(0,this.lastIndexOf(delimiter)) || this + ""
}

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

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

Это также можно легко сделать с помощью PATH, используя методы базена и экстрате.

const path = require('path')

path.basename('test.txt', path.extname('test.txt'))

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

name = filename.split(".");
// trimming with pop()
name.pop();
// getting the name with join()
name.join('.'); // we split by '.' and we join by '.' to restore other eventual points.

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

Обновление: если вы хотите, чтобы онеленер, здесь вы:

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

Еще один бейнер:

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

Вот еще одно решение на основе REGEOX:

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

Это должно только отрубать последний сегмент.

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

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

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

Простой:

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

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

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

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

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

Это где регулярные выражения пригодны! JavaScript's. .replace() Метод примет регулярное выражение, и вы можете использовать это, чтобы выполнить то, что вы хотите:

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

Еще один вкладыш - мы предполагаем, что наш файл - это изображение 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 не поддерживается в 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;
}

Я бы использовал что-то вроде X.субстронг (0, x.lastindexof ('.')). Если вы собираетесь на производительность, не ходите на JavaScript вообще :-P Нет, еще одно утверждение действительно не имеет значения для 99,99999% всех целей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top