Удалить последний каталог в URL
Я пытаюсь удалить последнюю часть каталога в URL. Мой URL выглядит так:
https://my_ip_address:port/site.php?path=/path/to/my/folder
,
При нажатии на кнопку, я хочу изменить это на
https://my_ip_address:port/site.php?path=/path/to/my
, (Удалить последнюю часть).
Я уже пробовала window.location.replace(/\/[A-Za-z0-9%]+$/, "")
что приводит к
https://my_ip_address:port/undefined
,
Какой Regex я должен использовать, чтобы сделать это?
6 ответов
Объяснение: Разнесите с помощью "/", удалите последний элемент с помощью pop, соедините снова с помощью "/".
function RemoveLastDirectoryPartOf(the_url)
{
var the_arr = the_url.split('/');
the_arr.pop();
return( the_arr.join('/') );
}
см. скрипку http://jsfiddle.net/GWr7U/
Используя этот код, удалите последний элемент из ссылки Url.
url.substring(0, url.lastIndexOf('/'));
Другой способ удалить конец пути к каталогу:
path.normalize(path.join(thePath, '..'));
Самый простой способ, который я предлагаю использовать, - это сочетание разделения, среза и объединения:
const baseUrl = 'https://my_ip_address:12345/site.php?path=/path/to/my/folder';
const newUrl = baseUrl.split('/').slice(0, -1).join('/');
В приведенном выше коде есть одна проблема: когда путь заканчивается косой чертой, он просто удаляет косую черту, не удаляя последний фрагмент пути. Мы можем решить это, добавив.filter(Boolean)
до.slice(0, -1)
но тогда, если URL-адрес имеет протокол, он заменит//
с/
.
Поэтому в более сложных ситуациях я предлагаю использовать этот безопасный вариант:
const baseUrl = 'https://my_ip_address:12345/site.php?path=/path/to/my/folder';
function removeLastDirectoryFromUrlSearchParam(baseUrl, paramName = 'path') {
const url = new URL(baseUrl);
const params = new URLSearchParams(url.search);
const path = params.get(paramName);
params.set(paramName, path.split('/').filter(Boolean).slice(0, -1).join('/'));
url.search = params.toString();
return url.toString();
}
const newUrl = removeLastDirectoryFromUrlSearchParam(baseUrl);
Вот код, который правильно обрабатывает /
, "", foo
а также /foo
(возвращение /
, "", foo
, а также /
соответственно):
function parentDirectory(dir: string): string {
const lastSlash = dir.lastIndexOf('/');
if (lastSlash === -1) {
return dir;
}
if (lastSlash === 0) {
return '/';
}
return dir.substring(0, lastSlash);
}
Просто удалите :string
s для Javascript. Возможно, вам нужно другое поведение, но вы должны хотя бы рассмотреть эти крайние случаи.
Придерживаясь собственных библиотек,
dirname
может быть полезно.
В
node
(бэкэнд)
const path = require('path')
let str='https://my_ip_address:port/site.php?path=/path/to/my/folder'
console.log(path.dirname(n))
console.log(path.dirname(n)+'/')
На выходе
'https://my_ip_address:port/site.php?path=/path/to/my'
'https://my_ip_address:port/site.php?path=/path/to/my'
В браузере Firefox (см. MDN, Управление путями, OS.Path.dirname])
let str='https://my_ip_address:port/site.php?path=/path/to/my/folder'
console.log(OS.path.dirname(n))
console.log(OS.path.dirname(n)+'/')
Извините, но я ничего не нашел для Chromium, но, возможно, я просто недостаточно внимательно посмотрел.