Ответ 1
Используйте функцию соответствия.
function GetFilename(url)
{
if (url)
{
var m = url.toString().match(/.*\/(.+?)\./);
if (m && m.length > 1)
{
return m[1];
}
}
return "";
}
У меня есть URL-адрес, например http://www.example.com/blah/th.html
Мне нужна функция javascript, чтобы дать мне значение "th".
Все мои URL-адреса имеют одинаковый формат (два имени файла с расширением .html).
Я хочу, чтобы это была безопасная функция, поэтому, если кто-то пропускает пустой URL-адрес, он не прерывается.
Я знаю, как проверить длину, но я должен проверять нуль вправо?
Используйте функцию соответствия.
function GetFilename(url)
{
if (url)
{
var m = url.toString().match(/.*\/(.+?)\./);
if (m && m.length > 1)
{
return m[1];
}
}
return "";
}
var filename = url.split('/').pop()
Почему так сложно?
var filename = url.split('/').pop().split('#')[0].split('?')[0];
Подобно другим, но... Я использовал Tom simple script - одну строку,
то вы можете использовать имя файла var где угодно:
http://www.tomhoppe.com/index.php/2008/02/grab-filename-from-window-location/
var filename = location.pathname.substr(location.pathname.lastIndexOf("/")+1);
Регулярное решение, которое учитывает URL-запрос и хэш-идентификатор:
function fileNameFromUrl(url) {
var matches = url.match(/\/([^\/?#]+)[^\/]*$/);
if (matches.length > 1) {
return matches[1];
}
return null;
}
JSFiddle здесь.
Использование jQuery с плагин URL:
var file = jQuery.url.attr("file");
var fileNoExt = file.replace(/\.(html|htm)$/, "");
// file == "th.html", fileNoExt = "th"
Я бы использовал функцию 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 "";
}
они не будут работать для длинного 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)
(Мне бы хотелось увидеть более быстрое или разумное решение)
Это должно работать для всех случаев
function getFilenameFromUrl(url: string): string {
const pathname = new URL(url).pathname;
const index = pathname.lastIndexOf('/');
return (-1 !== index ? pathname.substring(index + 1) : pathname);
}
<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>
Попробуйте это
url.substring(url.lastIndexOf('/')+1, url.length)
мои 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);
}
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.
Этот ответ работает только в среде браузера. Не подходит для узла.
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-адреса. Но это НЕ гарантирует, что имя файла является действительным и подходит для использования:
:
в окнах, \0
в большинстве ОС,...);Это ответ!
var filename = url.split('/').pop().replace(/[\#\?].*$/,'').split('.').shift()
url.split('/').pop()
.replace(/[\#\?].*$/,'')
строки с .replace(/[\#\?].*$/,'')
.split('.').shift()
Почему ответы пропустили это? Пример: http://www.example.com/blah/th.html#1234?xxx=555
http:
www.example.com
blah
--- pop ---> th.html#1234?xxx=555
th.html
th
<--- shift --- html
Об этом просилиДля узлов и браузеров, основанных на ответе @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')
})
})
url? url.substring(url.lastIndexOf('/')+1, url.lastIndexOf('.')):''
null
или undefined
результатом будет ''
.Это позволяет имени файла иметь несколько периодов!
Не спрашивается, но вы также можете иметь строку запроса без "/" и "."
Это исправленный ответ Абхишека Шармы, поэтому я высказал ему свое мнение. Такой гениальный и минимальный однострочный - я это там видел :)
Аналогично тому, что предложил @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" }
from Как получить имя файла из полного пути с помощью JavaScript?
var filename = fullPath.replace(/^.*[\\\/]/, '')