Zwraca ciąg bez ukośnika


196

Mam dwie zmienne:

site1 = "www.somesite.com";  
site2 = "www.somesite.com/";  

Chcę zrobić coś takiego

function someFunction(site)
{
    // If the var has a trailing slash (like site2), 
    // remove it and return the site without the trailing slash
    return no_trailing_slash_url;
}

Jak mam to zrobic?


Odpowiedzi:


480

Spróbuj tego:

function someFunction(site)     
{     
    return site.replace(/\/$/, "");
} 

122
Aby obsłużyć sprawy z wieloma końcowymi ukośnikami, możesz użyć:return site.replace(/\/+$/, "");
mikermcneil

13
„/".replace(/\/$/,” ”) będzie„ ”. „/” jest prawidłową ścieżką i nie należy jej usuwać.
puchu

79
function stripTrailingSlash(str) {
    if(str.substr(-1) === '/') {
        return str.substr(0, str.length - 1);
    }
    return str;
}

Uwaga: IE8 i starsze nie obsługują przesunięć ujemnych substratów. Użyj str.length - 1zamiast tego, jeśli chcesz obsługiwać te starożytne przeglądarki.


Naprawdę podoba mi się tutaj użycie terminu „starożytny”.
PageSource

48

ES6 / ES2015 zapewnia interfejs API do zadawania pytań, czy łańcuch kończy się czymś, co umożliwia napisanie czystszej i bardziej czytelnej funkcji.

const stripTrailingSlash = (str) => {
    return str.endsWith('/') ?
        str.slice(0, -1) :
        str;
};

3
najlepsze rozwiązanie w 2019 r.
Paul Rad

@PaulRad Podczas korzystania z tego rozwiązania, uzyskiwanie problemu z gałęzi str.slice (0, -1) nie jest uwzględnionego dla tego wiersza podczas testu jednostkowego. Jak to naprawić?
Bijay Rai

30

Użyłbym wyrażenia regularnego:

function someFunction(site)
{
// if site has an end slash (like: www.example.com/),
// then remove it and return the site without the end slash
return site.replace(/\/$/, '') // Match a forward slash / at the end of the string ($)
}

Musisz jednak upewnić się, że zmienna sitejest ciągiem.


3
Całkowicie się zgadzam, że za każdym razem, gdy napiszesz wyrażenie regularne, powinno ono być owinięte funkcją o nazwie opisowej lub z komentarzami.
Eric Labashosky,

12

Ten fragment jest dokładniejszy:

str.replace(/^(.+?)\/*?$/, "$1");
  1. Nie usuwa /ciągów, ponieważ jest to prawidłowy adres URL.
  2. Usuwa ciągi znaków z wieloma końcowymi ukośnikami.

Chociaż może to być poprawne podejście do usuwania wielu ukośników, nie jest to prośba PO.
Jon L.

@JonL. Wiele osób przegląda przepełnienie stosu, aby znaleźć odpowiedź. Uważam tę odpowiedź za pomocną niż odpowiedź zaakceptowana.
Ronnel Martinez

@JonL. Wiele osób przegląda przepełnienie stosu, aby znaleźć odpowiedź. Uważam tę odpowiedź za pomocną niż odpowiedź zaakceptowana.
Ronnel Martinez

10

Wiem, że pytanie dotyczy końcowych ukośników, ale znalazłem ten post podczas poszukiwań przycinania ukośników (zarówno na ogonie, jak i na początku literału łańcucha), ponieważ ludzie potrzebowaliby tego rozwiązania, które zamieszczam tutaj:

'///I am free///'.replace(/^\/+|\/+$/g, ''); // returns 'I am free'

AKTUALIZACJA :

jak wspomniano w komentarzach @Stephen R , jeśli chcesz usunąć zarówno ukośniki, jak i ukośniki odwrotne zarówno na ogonie, jak i na początku literału łańcucha, napiszesz:

'\/\\/\/I am free\\///\\\\'.replace(/^[\\/]+|[\\/]+$/g, '') // returns 'I am free'

To jest prawdziwa odpowiedź!
Można PERK

1
Jeśli chcesz przyciąć zarówno ukośniki, jak i ukośniki odwrotne:.replace(/^[\\/]+|[\\/]+$/g, '')
Stephen R

3

Na podstawie odpowiedzi @vdegenne ... jak rozebrać:

Pojedynczy ukośnik:

theString.replace(/\/$/, '');

Pojedyncze lub kolejne ukośniki końcowe:

theString.replace(/\/+$/g, '');

Pojedynczy ukośnik:

theString.replace(/^\//, '');

Pojedyncze lub kolejne ukośniki:

theString.replace(/^\/+/g, '');

Pojedyncze ukośniki wiodące i końcowe:

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

Pojedyncze lub kolejne ukośniki wiodące i końcowe:

theString.replace(/^\/+|\/+$/g, '')

Aby obsługiwać zarówno ukośniki i pleców ukośniki, wymienić wystąpienia \/z[\\/]


2

Łatwo o tym wiem

function stipTrailingSlash(str){
   if(srt.charAt(str.length-1) == "/"){ str = str.substr(0, str.length - 1);}
   return str
}

Spowoduje to sprawdzenie / na końcu i jeśli go tam usunie, jeśli nie, zwróci Twój ciąg znaków tak, jak był

Tylko jedna rzecz, której nie mogę jeszcze komentować @ ThiefMaster wow, nie obchodzi cię pamięć, czy nie chcesz uruchomić substra tylko dla if?

Naprawiono obliczanie indeksu zerowego w łańcuchu.


2

Oto mały przykład adresu URL.

var currentUrl = location.href;

if(currentUrl.substr(-1) == '/') {
    currentUrl = currentUrl.substr(0, currentUrl.length - 1);
}

zaloguj nowy adres URL

console.log(currentUrl);

1
function stripTrailingSlash(text) {
    return text
        .split('/')
        .filter(Boolean)
        .join('/');
}

inne rozwiązanie.


-11
function someFunction(site) {
  if (site.indexOf('/') > 0)
    return site.substring(0, site.indexOf('/'));
  return site;
}

2
subtring? Poza tym usuwa pierwszy ukośnik i wszystko po nim.
ThiefMaster

@ThiefMaster: Naprawdę? Nie możesz powiedzieć, że miałem na myśli substring? Również tak, chciałem usunąć pierwszy ukośnik i wszystko po nim, ponieważ wypełnia on rachunek za opublikowane pytanie i przykładowe dane.
josh.trow

Cóż, jego komentarz mówi, że chce usunąć końcowy ukośnik
ThiefMaster

@ ThiefMaster: Co, według jego przykładów, robi mój kod.
josh.trow

1
Tylko nie, dlaczego nie używać tego w dowolnym momencie, jeśli adresy URL zmieniają się na „w pełni kwalifikowane”, mają http: // to nie będzie działać, a wszelkie linki z / w środku nie będą działać dla googlersów
Barkermn01
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.