Удалить косую черту из начала и конца URL - PullRequest
0 голосов
/ 26 января 2019

У меня есть URL, например:

var folderPath = 'files/New folder';

Вот условия, которые я хочу предотвратить, например, пользователь пытается:

../../.././../../././../files/New folder

ИЛИ

../../.././../../././../files/New folder/../../././../.././

ИЛИ

./files/New folder/

По сути, мне нужно извлечь новую папку из URL, поэтому мне нужно очистить URL!

ЧТО Я ПОПРОБОВАЛ?

Попробовал следующее, но он удаляет только несколько слешей "../" и "./" в начале URL.

var cleaned  = folderPath.replace(/^.+\.\//, '');

ОЖИДАЕМЫЙ ВЫХОД: если кто-томожет обеспечить функцию, которая очищает URL, которая будет очень полезна.

files/New folder

Ответы [ 4 ]

0 голосов
/ 26 января 2019

Для удаления всех / с предшествующим . или / плюс окончание /:

var folderPaths = [
  "../../.././../../././../files/New folder",
  "../../.././../../././../files/New folder/../../././../.././",
  "./files/New folder/"
];
var re = new RegExp('(?:[./]+)/|/$', 'g');

folderPaths.forEach(e => console.log(e.replace(re, "")));
0 голосов
/ 26 января 2019

Вы можете использовать это регулярное выражение для удаления всего нежелательного текста на вашем пути,

\/?\.\.?\/|\/{2,}|\/\s*$

\/?\.\.?\/ удаляет все шаблоны типа ../ или ./ или /../, а \/{2,} удаляет все вхождения двух или более /, а \/\s* удаляет все завершающие косые черты в пути.

Демо

console.log('../../.././../../././../files/New folder'.replace(/\/?\.\.?\/|\/{2,}|\/\s*$/g,''));
console.log('../../.././../../././../files/New folder/../../././../.././'.replace(/\/?\.\.?\/|\/{2,}|\/\s*$/g,''));
console.log('./files/New folder/'.replace(/\/?\.\.?\/|\/{2,}|\/\s*$/g,''));
console.log('///../..///files/New folder///../'.replace(/\/?\.\.?\/|\/{2,}|\/\s*$/g,''));
0 голосов
/ 26 января 2019

Как насчет фильтра?

var oneSlash = (str) => str.split("/").filter(
      word => word.match(/\w+/)
    ).join("/")

console.log(oneSlash(" ../../.././../../././../files/New folder"))

console.log(oneSlash("///../..///files/New folder///../"))

// this imaginary useless path ends up like the others

console.log(oneSlash("files/////New folder/"))
0 голосов
/ 26 января 2019

Итак, идея заключается в том, чтобы сначала использовать регулярное выражение: я извлекаю совпадение из входной строки, но оно включает в себя // дополнительные, которые вы также хотите удалить, поэтому в функции обратного вызова я удаляю эти //, также используя замену на подходящая группа.

Я полагаю, что это (с помощью замены дважды) все еще можно улучшить, я пытаюсь улучшить еще немного.

function replaceDots(input){
  return input.replace(/^[./]+([^.]+)\/?.*/g, function(match,group){
    return group.replace(/(.*?)\/*$/, "$1")
  })
}

console.log(replaceDots(`../../.././../../././../files/New folder`))
console.log(replaceDots(`files/New folder`))
console.log(replaceDots(`../../.././../../././../files/New folder/../../././../.././`))
console.log(replaceDots(`///../..///files/New folder///../`))
...