2010-10-01 4 views
51

У меня есть эти строки в JavaScript:Javascript регулярное выражение: удалить первый и последний слэш

/banking/bonifici/italia 
/banking/bonifici/italia/ 

, и я хотел бы удалить первый и последний слеш, если это существует.

Я пробовал ^\/(.+)\/?$, но он не работает.

Чтение некоторых сообщений в stackoverflow Я обнаружил, что php имеет функцию обрезки, и я мог бы использовать его javascript-перевод (http://phpjs.org/functions/trim: 566), но я бы предпочел «простое» регулярное выражение.

+1

Связано: [Обрезать только первое и последнее вхождение символа в строке (PHP)] (http://stackoverflow.com/questions/3834319/trim-only-the-first-and-last-occurrence- of-a-character-in-a-string-php) –

ответ

122
return theString.replace(/^\/|\/$/g, ''); 

"Заменить все (/.../g), ведущий слэш (^\/) или (|) слэш (\/$) с пустой строкой."

+9

Я изменил это, чтобы удалить любое число ведущих или завершающих косых черт с помощью «+»: replace (/^\/+ | \/+ $/g, ' ') – rickumali

24

Там нет никакой реальной причины, чтобы использовать регулярное выражение здесь, строковые функции будут работать нормально:

var string = "/banking/bonifici/italia/"; 
if (string.charAt(0) == "/") string = string.substr(1); 
if (string.charAt(string.length - 1) == "/") string = string.substr(0, string.length - 1); 
// string => "banking/bonifici/italia" 

Увидеть это в действии на jsFiddle.

Ссылки:

+2

Это хорошая kis-точка зрения (Keep It Simple) – Aif

+0

Согласен, regexp здесь лучший. – Shawn31313

+0

Я думаю, что иногда избегание регулярного выражения поможет в удобочитаемости, но в этом случае использование 1 строки регулярного выражения и 1 строки комментария на самом деле будет работать гораздо более элегантным способом. – kroe

3

Только в том случае, кто нуждается в преждевременной оптимизации здесь ...

http://jsperf.com/remove-leading-and-trailing-slashes/5

var path = '///foo/is/not/equal/to/bar///' 
var count = path.length - 1 
var index = 0 

while (path.charCodeAt(index) === 47 && ++index); 
while (path.charCodeAt(count) === 47 && --count); 

path = path.slice(index, count + 1) 
+0

WOW .. Пока петли! двое из них! –

1

В случае, если с помощью RegExp является не вариант, или вы должны обрабатывать угловые случаи при работе с URL-адресами (например, двойной/тройной косой чертой или пустыми строками без сложных замен), или с использованием дополнительной обработки, вот менее очевидно, но более функциональный стиль решения:

const urls = [ 
 
    '//some/link///to/the/resource/', 
 
    '/root', 
 
    '/something/else', 
 
]; 
 

 
const trimmedUrls = urls.map(url => url.split('/').filter(x => x).join('/')); 
 

 
console.log(trimmedUrls);

В этом фрагменте filter() функция может реализовать более сложную логику, чем просто фильтрации пустых строк (которые по умолчанию поведение).

Слово предупреждения - здесь не так быстро, как другие фрагменты.