Нужна функция базового имени в Javascript - PullRequest
44 голосов
/ 29 сентября 2010

Мне нужна функция короткого базового имени (однострочная?) Для Javascript:

basename("/a/folder/file.a.ext") -> "file.a"
basename("/a/folder/file.ext") -> "file"
basename("/a/folder/file") -> "file"

Это должно лишить путь и любое расширение.

Обновление: К точке в начале было бы неплохо относиться как к «особым» файлам

basename("/a/folder/.file.a.ext") -> ".file.a"
basename("/a/folder/.file.ext") -> ".file"
basename("/a/folder/.file") -> ".file" # empty is Ok
basename("/a/folder/.fil") -> ".fil"  # empty is Ok
basename("/a/folder/.file..a..") -> # does'nt matter

Ответы [ 14 ]

0 голосов
/ 28 сентября 2017

UPDATE

Улучшенная версия, которая работает с прямой / и обратной косой чертой \, одинарная или двойная, означает одно из следующих значений:

  • \\path\\to\\file
  • \path\to\file
  • //path//to//file
  • /path/to/file
  • http://url/path/file.ext
  • http://url/path/file

См. Рабочую демонстрацию ниже

let urlHelper = {};
urlHelper.basename = (path) => {
  let isForwardSlash = path.match(/\/{1,2}/g) !== null;
  let isBackSlash = path.match(/\\{1,2}/g) !== null;

  if (isForwardSlash) {
    return path.split('/').reverse().filter(function(el) {
      return el !== '';
    })[0];
  } else if (isBackSlash) {
    return path.split('\\').reverse().filter(function(el) {
      return el !== '';
    })[0];
  }
  return path;
};

$('em').each(function() {
  var text = $(this).text();
  $(this).after(' --> <strong>' + urlHelper.basename(text) + '</strong><br>');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<em>http://folder/subfolder/file.ext</em><br>
<em>http://folder/subfolder/subfolder2</em><br>
<em>/folder/subfolder</em><br>
<em>/file.ext</em><br>
<em>file.ext</em><br>
<em>/folder/subfolder/</em><br>
<em>//folder//subfolder//</em><br>
<em>//folder//subfolder</em><br>
<em>\\folder\\subfolder\\</em><br>
<em>\\folder\\subfolder\\file.ext</em><br>
<em>\folder\subfolder\</em><br>
<em>\\folder\\subfolder</em><br>
<em>\\folder\\subfolder\\file.ext</em><br>
<em>\folder\subfolder</em><br>

Более простым решением может быть

function basename(path) {
      return path.replace(/\/+$/, "").replace( /.*\//, "" );
}

Input                           basename()
/folder/subfolder/file.ext   --> file.ext
/folder/subfolder            --> subfolder
/file.ext                    --> file.ext
file.ext                     --> file.ext
/folder/subfolder/           --> subfolder

Рабочий пример: https://jsfiddle.net/Smartik/2c20q0ak/1/

0 голосов
/ 20 августа 2017

если ваша исходная строка или текстовый файл содержит один символ обратной косой черты, вы можете найти его, используя '\'. в моих обстоятельствах я использую JavaScript, чтобы найти индекс "\ N" из текстового файла. и str.indexOf ('\ N'); помог мне найти \ N из исходной строки, которая читается из исходного файла. надеюсь, это поможет.

0 голосов
/ 09 июня 2015
my_basename('http://www.example.com/dir/file.php?param1=blabla#cprod',   '/',  '?');
// returns:  file.php

КОД:

function my_basename(str, DirSeparator, FileSeparator) { var x= str.split(DirSeparator); return x[x.length-1].split(FileSeparator)[0];}
0 голосов
/ 29 сентября 2010

Довольно просто с помощью регулярных выражений:

function basename(input) {
   return input.split(/\.[^.]+$/)[0];
}

Пояснение:

Соответствует одному точечному символу, за которым следует любой символ, кроме точки ([^.]), один или несколько раз (+), привязанный к концу строки ($).

Затем она разбивает строку на основе этого критерия соответствия и возвращает первый результат (т. Е. Все до совпадения).

[EDIT] D'о. Неправильно прочитанный вопрос - он тоже хочет сойти с пути. Ну да ладно, это все равно отвечает на половину вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...