Restituisce la stringa senza barra


198

Ho due variabili:

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

Voglio fare qualcosa del genere

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;
}

Come faccio a fare questo?


Risposte:


481

Prova questo:

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

124
Per gestire i casi con più barre finali, è possibile utilizzare:return site.replace(/\/+$/, "");
mikermcneil,

13
"/".replace(/\/$/," ") sarà" ". "/" è un percorso valido e non deve essere rimosso.
Puchu,

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

Nota: IE8 e precedenti non supportano gli offset di substr negativi. Utilizzare str.length - 1invece se è necessario supportare quei browser antichi.


Mi piace molto l'uso del termine "antico" qui.
PageSource

48

ES6 / ES2015 fornisce un'API per chiedere se una stringa termina con qualcosa, che consente di scrivere una funzione più pulita e più leggibile.

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

3
migliore soluzione nel 2019 🤙
Paul Rad,

@PaulRad Durante l'utilizzo di questo soln, il problema con il ramo str.slice (0, -1) non è coperto per questa riga nel test unitario. Come risolverlo?
Bijay Rai,

1
@BijayRai significa che ai tuoi test manca un caso in cui strtermina con una /barra. Dovresti avere due asserzioni (o due prove), una con una barra e una senza.
Seth Holladay

30

Userei un'espressione regolare:

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 ($)
}

siteTuttavia, ti consigliamo di assicurarti che la variabile sia una stringa.


3
Sono totalmente d'accordo, ogni volta che scrivi regex, dovrebbe essere racchiuso in una funzione con un nome descrittivo o con commenti.
Eric Labashosky,

12

Questo frammento è più preciso:

str.replace(/^(.+?)\/*?$/, "$1");
  1. Non si spoglia / stringhe, poiché è un URL valido.
  2. Elimina le stringhe con più barre finali.

Sebbene questo possa essere un approccio valido per la rimozione di più barre, questa non è la richiesta dell'OP.
Jon L.

@JonL. Molte persone sfogliano lo stack overflow per trovare la risposta. Trovo questa risposta utile rispetto alla risposta accettata.
Ronnel Martinez,

@JonL. Molte persone sfogliano lo stack overflow per trovare la risposta. Trovo questa risposta utile rispetto alla risposta accettata.
Ronnel Martinez,

11

So che la domanda riguarda le barre finali, ma ho trovato questo post durante la mia ricerca di barre tagliate (sia alla coda che alla testa di una stringa letterale), poiché le persone avrebbero bisogno di questa soluzione ne sto pubblicando una qui:

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

AGGIORNAMENTO :

come @Stephen R menzionato nei commenti, se vuoi rimuovere sia le barre che le barre rovesciate sia alla coda che alla testa di una stringa letterale, scrivi:

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

Questa è la vera risposta!
Può PERK

2
Se si desidera tagliare entrambe le barre e le barre rovesciate:.replace(/^[\\/]+|[\\/]+$/g, '')
Stephen R

3

Basato sulla risposta di @vdegenne ... come eliminare:

Singola barra finale:

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

Barre finali singole o consecutive:

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

Singola barra iniziale:

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

Barre iniziali singole o consecutive:

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

Singole barre iniziali e finali:

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

Barre iniziali e finali singole o consecutive:

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

Per gestire sia le barre che le barre posteriori , sostituire le istanze di \/con[\\/]


2

Il modo in cui conosco è questo

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

Questo controllerà quindi un / alla fine e se è lì rimuoverlo se non restituirà la stringa così com'era

Solo una cosa che non posso ancora commentare @ThiefMaster wow non ti interessa la memoria lol corri un substr solo per un if?

Risolto il problema con il calcolo dell'indice in base zero sulla stringa.


2

Ecco un piccolo esempio di URL.

var currentUrl = location.href;

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

registra il nuovo URL

console.log(currentUrl);

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

un'altra soluzione.


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

2
subtring? Oltre a ciò, rimuove la prima barra e tutto il resto.
ThiefMaster,

@ThiefMaster: Davvero? Non puoi dire che intendevo substring? Inoltre sì, intendevo rimuovere la prima barra e tutto il resto poiché riempie il conto per la domanda e i dati di esempio pubblicati.
josh.trow,

Bene, il suo commento dice che vuole rimuovere la barra finale
ThiefMaster il

@ThiefMaster: che, secondo i suoi esempi, il mio codice fa.
josh.trow,

1
Solo un non perché non usarlo in qualsiasi momento se gli URL cambiano in "qualificati" hanno http: // questo non funzionerà e tutti i collegamenti con / nel mezzo non funzioneranno per i googler
Barkermn01,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.