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

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

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

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

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

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

Ответы [ 18 ]

1 голос
/ 04 февраля 2009
<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>
0 голосов
/ 15 июля 2016
0 голосов
/ 17 февраля 2016
function getFileName(url) {
  // Remove the QueryString
  url = url.replace(/\?.*$/, '');
  // Extract the last part
  return url.split('/').pop();
}
0 голосов
/ 23 сентября 2015

мои 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);
}
0 голосов
/ 11 сентября 2013

Аналогично тому, что предлагал @ 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"}

0 голосов
/ 03 мая 2019

Это ответ!

var filename = url.split('/').pop().replace(/[\#\?].*$/,'').split('.').shift()
  1. Удалить путь с помощью url.split('/').pop()
  2. Удалить любой # или? строки с .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 --- <code>html Это было запрошено для
0 голосов
/ 10 июня 2019

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

export function getFileNameFromUrl(url: string) {
  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')
  })
})
0 голосов
/ 18 января 2016

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

url.substring(url.lastIndexOf('/')+1, url.length)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...