Подтвердить что ты не робот

Функция js для получения имени файла из URL-адреса

У меня есть URL-адрес, например http://www.example.com/blah/th.html

Мне нужна функция javascript, чтобы дать мне значение "th".

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

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

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

4b9b3361

Ответ 1

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

function GetFilename(url)
{
   if (url)
   {
      var m = url.toString().match(/.*\/(.+?)\./);
      if (m && m.length > 1)
      {
         return m[1];
      }
   }
   return "";
}

Ответ 2

var filename = url.split('/').pop()

Ответ 3

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

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

Ответ 5

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

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

JSFiddle здесь.

Ответ 6

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

var file = jQuery.url.attr("file");
var fileNoExt = file.replace(/\.(html|htm)$/, "");
// file == "th.html", fileNoExt = "th"

Ответ 7

Я бы использовал функцию 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 "";
}

Ответ 8

они не будут работать для длинного 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)

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

Ответ 9

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

function getFilenameFromUrl(url: string): string {
  const pathname = new URL(url).pathname;
  const index = pathname.lastIndexOf('/');
  return (-1 !== index ? pathname.substring(index + 1) : pathname);
}

Ответ 10

<script type="text/javascript">
function getFileName(url){
  var path = window.location.pathName;
  var file = path.replace(/^.*\/(\w{2})\.html$/i, "$1");
  return file ? file : "undefined";
}
</script>

Ответ 11

Попробуйте это

url.substring(url.lastIndexOf('/')+1, url.length)

Ответ 12

мои 2 цента

метод LastIndexOf ( "/" ) сам по себе падает, если в числовых запросов содержится "/"

Мы все знаем, что они должны быть закодированы как %2F, но для устранения проблем потребуется только одно неэкранированное значение.

Эта версия правильно обрабатывает/в цепочках и не имеет никакой зависимости. в URL

function getPageName() {
    //#### Grab the url
    var FullUrl = window.location.href;

    //#### Remove QueryStrings
    var UrlSegments = FullUrl.split("?")
    FullUrl = UrlSegments[0];

    //#### Extract the filename
    return FullUrl.substr(FullUrl.lastIndexOf("/") + 1);
}

Ответ 13

function getFileNameWithoutExtension(url) {
  if (typeof url !== 'string') throw new Error('url must be a string');
  // Remove the QueryString
  return url.replace(/\?.*$/, '')
  // Extract the filename
  .split('/').pop()
  // Remove the extension
  .replace(/\.[^.]+$/, '');
}

Это вернет news с этого URL http://www.myblog.com/news.php?year=2019#06.

Ответ 14

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

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. Также обратите внимание, что URL-адрес не всегда содержит имя файла.

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

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

Ответ 15

Это ответ!

var filename = url.split('/').pop().replace(/[\#\?].*$/,'').split('.').shift()
  1. Удалите путь с помощью url.split('/').pop()
  2. Удалить любой # или? .replace(/[\#\?].*$/,'') строки с .replace(/[\#\?].*$/,'')
  3. Удалите все расширения с помощью .split('.').shift() Почему ответы пропустили это?

Пример: http://www.example.com/blah/th.html#1234?xxx=555

  1. Разделите на '/' и http: www.example.com blah --- pop ---> th.html#1234?xxx=555
  2. Заменить на пустую строку из '#' или '?' до конца $ ---> th.html
  3. Разделить на '.' и th <--- shift --- html Об этом просили

Ответ 16

Для узлов и браузеров, основанных на ответе @pauls, но решающих проблемы с хешем и более оборонительных:

export function getFileNameFromUrl(url) {
  const hashIndex = url.indexOf('#')
  url = hashIndex !== -1 ? url.substring(0, hashIndex) : url
  return (url.split('/').pop() || '').replace(/[\?].*$/g, '')
} 

Несколько случаев:

describe('getFileNameFromUrl', () => {

  it('absolute, hash and no extension', () => {
    expect(getFileNameFromUrl(
      'https://foo.bar/qs/bar/js-function-to-get-filename-from-url#comment95124061_53560218'))
    .toBe('js-function-to-get-filename-from-url')
  })

  it('relative, extension and parameters', () => {
    expect(getFileNameFromUrl('../foo.png?ar=8')).toBe('foo.png')
  })

  it('file name with multiple dots, hash with slash', () => {
    expect(getFileNameFromUrl('questions/511761/js-function.min.js?bar=9.9&y=1#/src/jjj?=9.9')).toBe('js-function.min.js')
  })
})

Ответ 17

url? url.substring(url.lastIndexOf('/')+1, url.lastIndexOf('.')):''
  • Безопасность, как и просили. когда url равен null или undefined результатом будет ''.
  • Удаляет весь путь с помощью ":", точек и любого символа, включая последний "/".
  • Это дает истинный ответ "th" в соответствии с запросом, а не "th.index". Это очень важно, конечно, чтобы это работало вообще.
  • Это позволяет имени файла иметь несколько периодов!

  • Не спрашивается, но вы также можете иметь строку запроса без "/" и "."

Это исправленный ответ Абхишека Шармы, поэтому я высказал ему свое мнение. Такой гениальный и минимальный однострочный - я это там видел :)

Ответ 18

Аналогично тому, что предложил @user2492653, если все, что вам нужно, это имя файла, например Firefox, то вы используете метод split(), который разбивает строку на массив компонентов, тогда все, что вам нужно сделать возьмите последний индекс.

var temp = url.split("//");
if(temp.length > 1)
 return temp[temp.length-1] //length-1 since array indexes start at 0

Это приведет к поломке C:/fakepath/test.csv в { "C:", "fakepath", "test.csv" }