Удалить последний каталог в 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);
}

Просто удалите :strings для 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, но, возможно, я просто недостаточно внимательно посмотрел.

Другие вопросы по тегам