Функция JS, чтобы получить имя файла из URL - PullRequest
38 голосов
/ 04 февраля 2009

У меня есть URL как http://www.example.com/blah/th.html

Мне нужна функция javascript для получения значения th из этого значения.

Все мои URL имеют одинаковый формат (двухбуквенные имена файлов с расширением .html).

Я хочу, чтобы это была безопасная функция, поэтому, если кто-то передает пустой URL, он не прерывается.

Я знаю, как проверить длину, но я должен проверять ноль справа?

Ответы [ 18 ]

111 голосов
/ 17 июня 2013
var filename = url.split('/').pop()
58 голосов
/ 21 апреля 2016

Почему так сложно?

var filename = url.split('/').pop().split('#')[0].split('?')[0];

20 голосов
/ 04 февраля 2009

Используйте функцию соответствия.

function GetFilename(url)
{
   if (url)
   {
      var m = url.toString().match(/.*\/(.+?)\./);
      if (m && m.length > 1)
      {
         return m[1];
      }
   }
   return "";
}
9 голосов
/ 19 марта 2010

Аналогично другим, но ... Я использовал простой сценарий Тома - одну строку,
тогда вы можете использовать имя файла где угодно:
http://www.tomhoppe.com/index.php/2008/02/grab-filename-from-window-location/

var filename = location.pathname.substr(location.pathname.lastIndexOf("/")+1);
5 голосов
/ 03 апреля 2016

Решение для регулярных выражений, которое учитывает URL-запрос и хэш-идентификатор:

function fileNameFromUrl(url) {
   var matches = url.match(/\/([^\/?#]+)[^\/]*$/);
   if (matches.length > 1) {
     return matches[1];
   }
   return null;
}

JSFiddle здесь .

2 голосов
/ 30 ноября 2018

Это должно работать для всех случаев

function getFilenameFromUrl(url: string): string {
  const pathname = new URL(url).pathname;
  const index = pathname.lastIndexOf('/');
  return (-1 !== index ? pathname.substring(index + 1) : pathname);
}
2 голосов
/ 06 января 2015

те не будут работать для длинных URL, как
"/ моя / папка / questions.html # dssddsdsd? Тото = 33 & dududu = podpodpo"

здесь я ожидаю получить "questions.html". Таким образом, возможное (медленное) решение, как показано ниже

fname=function(url) 
{ return url?url.split('/').pop().split('#').shift().split('?').shift():null }

тогда вы можете проверить, что в любом случае вы получите только имя файла.

fname("/my/folder/questions.html#dssddsdsd?toto=33&dududu=podpodpo")
-->"questions.html"
fname("/my/folder/questions.html#dssddsdsd")
-->"questions.html"
fname("/my/folder/questions.html?toto=33&dududu=podpodpo")
"-->questions.html"

(and it works for null)

(я бы хотел увидеть более быстрое или разумное решение)

2 голосов
/ 06 января 2013

Я бы использовал функцию substring в сочетании с lastIndexOf. Это позволит использовать имена файлов с точками в них, например, учитывая http://example.com/file.name.txt это дает file.name в отличие от принятого ответа, который даст file.

function GetFilename(url)
{
    if (url)
    {
        return url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
    }
    return "";
}
2 голосов
/ 04 февраля 2009

Использование jQuery с плагином URL :

var file = jQuery.url.attr("file");
var fileNoExt = file.replace(/\.(html|htm)$/, "");
// file == "th.html", fileNoExt = "th"
1 голос
/ 01 февраля 2018

Этот ответ работает только в браузерной среде. Не подходит для узла.

function getFilename(url) {
  const filename = decodeURIComponent(new URL(url).pathname.split('/').pop());
  if (!filename) return 'index.html'; // some default filename
  return filename;
}

function filenameWithoutExtension(filename) {
  return filename.replace(/^(.+?)(?:\.[^.]*)?$/, '$1');
}

Для браузеров, не поддерживающих new URL, вы можете захотеть:

var a = document.createElement('a');
a.href = url;
var pathname = a.pathname;

Вот две функции:

  • первый получить имя файла из URL
  • второй получить имя файла без расширения из полного имени файла

Для парсинга URL лучшим выбором будет новый объект URL. Также обратите внимание, что URL не всегда содержит имя файла.

Примечание: Эта функция пытается разрешить имя файла из URL. Но это НЕ гарантирует, что имя файла допустимо и подходит для использования:

  • Некоторые ОС запрещают определенный символ в имени файла (например, : в Windows, \0 в большинстве ОС, ...);
  • Некоторые имена файлов могут быть зарезервированы ОС (например, CON в Windows);
  • Некоторое имя файла может сделать пользователя недовольным его обработкой (например, файл с именем --help в Linux)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...