Retornar string sem barra final


196

Eu tenho duas variáveis:

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

Eu quero fazer algo assim

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

Como eu faço isso?


Respostas:


478

Tente o seguinte:

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

122
Para lidar com casos com várias barras à direita, você pode usar:return site.replace(/\/+$/, "");
mikermcneil

13
"/".replace(/\/$/," ") será" ". "/" é um caminho válido e não deve ser removido.
Puchu

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

Nota: O IE8 e anteriores não suportam deslocamentos negativos de substr. Em str.length - 1vez disso, use se precisar oferecer suporte aos navegadores antigos.


Realmente gosto do uso do termo 'antigo' aqui.
PageSource

48

O ES6 / ES2015 fornece uma API para perguntar se uma sequência termina com algo, o que permite escrever uma função mais limpa e legível.

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

3
melhor solução em 2019
Paul

@PaulRad Ao usar este soln, não é possível obter o problema da ramificação str.slice (0, -1) para esta linha no teste de unidade. Como consertar isso?
Bijay Rai 26/06

30

Eu usaria uma expressão regular:

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

Você vai querer ter certeza de que a variável siteé uma string.


3
Concordo totalmente, sempre que você escrever regex, ele deverá ser envolvido em uma função com um nome descritivo ou com comentários.
Eric Labashosky

12

Este trecho é mais preciso:

str.replace(/^(.+?)\/*?$/, "$1");
  1. Não remove /strings, pois é um URL válido.
  2. Ele tira as cordas com várias barras à direita.

Embora essa possa ser uma abordagem válida para remover várias barras, esse não é o pedido do OP.
Jon L.

@JonL. Muitas pessoas navegam pelo estouro da pilha para encontrar a resposta. Acho esta resposta útil do que a resposta aceita.
Ronnel Martinez 03/03

@JonL. Muitas pessoas navegam pelo estouro da pilha para encontrar a resposta. Acho esta resposta útil do que a resposta aceita.
Ronnel Martinez 03/03

10

Sei que a pergunta é sobre barras à direita, mas encontrei este post durante minha pesquisa por barras (na cauda e no cabeçalho de uma cadeia de caracteres literal), pois as pessoas precisariam dessa solução. Estou postando uma aqui:

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

ATUALIZAR :

como @Stephen R mencionado nos comentários, se você deseja remover barras e barras invertidas na cauda e na cabeça de uma literal de cadeia de caracteres, escreva:

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

Esta é a verdadeira resposta!
pode animar

1
Se você deseja cortar barras e barras invertidas:.replace(/^[\\/]+|[\\/]+$/g, '')
Stephen R

2

A maneira mais fácil que eu conheço é essa

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

Isso irá verificar se há um / no final e, se estiver lá, remova-o, se não estiver, retornará sua string como estava.

Apenas uma coisa que eu não posso comentar ainda @ThiefMaster wow você não se importa com a memória você lol runnign um substr apenas para um se?

Corrigida a calibração do índice baseado em zero na sequência.


2

Aqui está um pequeno exemplo de URL.

var currentUrl = location.href;

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

registrar o novo URL

console.log(currentUrl);

2

Baseado na resposta de @vdegenne ... como retirar:

Única barra à direita:

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

Barras à direita ou consecutivas:

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

Barra única:

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

Barras principais simples ou consecutivas:

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

Barras simples à direita e à direita:

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

Barras simples ou consecutivas à frente e à direita:

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

Para lidar com ambas as barras e traseiras barras, substitua as instâncias de \/com[\\/]


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

outra solução.


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

2
subtring? Além disso, remove a primeira barra e tudo depois dela.
ThiefMaster

@ThiefMaster: Sério? Você não pode dizer que eu quis dizer substring? Além disso, sim, pretendia remover a primeira barra e tudo o que estava depois dela, pois ela preenche a conta da pergunta e dos dados de exemplo publicados.
Josh.trow

Bem o seu comentário diz que quer remover a barra final
ThiefMaster

@ThiefMaster: Qual, de acordo com seus exemplos, meu código faz.
21711 josh.trow

1
Só não sei por que não usar isso a qualquer momento se os URLs mudarem para serem "totalmente qualificados" têm http: // isso não funcionará e quaisquer links com / no meio não funcionarão para os googlers
Barkermn01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.