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.