Renvoie la chaîne sans barre oblique finale

198

J'ai deux variables:

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

Je veux faire quelque chose comme ça

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

Comment puis-je faire cela?

Ryan
la source

Réponses:

481

Essaye ça:

function someFunction(site)     
{     
    return site.replace(/\/$/, "");
} 
Chandu
la source
124
Pour gérer les cas avec plusieurs barres obliques, vous pouvez utiliser:return site.replace(/\/+$/, "");
mikermcneil
13
"/".replace(/\/$/," ") sera" ". "/" est un chemin valide et il ne doit pas être supprimé.
puchu
79
function stripTrailingSlash(str) {
    if(str.substr(-1) === '/') {
        return str.substr(0, str.length - 1);
    }
    return str;
}

Remarque: IE8 et les versions antérieures ne prennent pas en charge les décalages de sous-titres négatifs. Utilisez str.length - 1plutôt si vous avez besoin de prendre en charge ces anciens navigateurs.

ThiefMaster
la source
Vraiment comme l'utilisation du terme «ancien» ici.
PageSource
48

ES6 / ES2015 fournit une API pour demander si une chaîne se termine par quelque chose, ce qui permet d'écrire une fonction plus propre et plus lisible.

const stripTrailingSlash = (str) => {
    return str.endsWith('/') ?
        str.slice(0, -1) :
        str;
};
Seth Holladay
la source
3
meilleure solution en 2019 🤙
Paul Rad
@PaulRad Lors de l'utilisation de cette solution, obtenir le problème de la branche str.slice (0, -1) non couvert pour cette ligne sur le test unitaire. Comment y remédier?
Bijay Rai
1
@BijayRai cela signifie que vos tests manquent un cas où strse termine par une /barre oblique. Vous devriez avoir deux assertions (ou deux tests), une avec une barre oblique et une sans.
Seth Holladay le
30

J'utiliserais une expression régulière:

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

Vous voudrez cependant vous assurer que la variable siteest une chaîne.

ChronosLLC
la source
3
Je suis tout à fait d'accord, chaque fois que vous écrivez une regex, elle doit être enveloppée dans une fonction avec un nom descriptif ou avec des commentaires.
Eric Labashosky
12

Cet extrait est plus précis:

str.replace(/^(.+?)\/*?$/, "$1");
  1. Il ne supprime pas les /chaînes, car c'est une URL valide.
  2. Il supprime les chaînes avec plusieurs barres obliques de fin.
1ven
la source
Bien que cela puisse être une approche valide pour supprimer plusieurs barres obliques, ce n'est pas la demande de l'OP.
Jon L.
@JonL. Beaucoup de gens parcourent le débordement de pile pour trouver une réponse. Je trouve cette réponse plus utile que la réponse acceptée.
Ronnel Martinez
@JonL. Beaucoup de gens parcourent le débordement de pile pour trouver une réponse. Je trouve cette réponse plus utile que la réponse acceptée.
Ronnel Martinez
11

Je sais que la question concerne les barres obliques de fin, mais j'ai trouvé cet article lors de ma recherche de barres obliques de coupe (à la fois à la queue et à la tête d'une chaîne littérale), car les gens auraient besoin de cette solution, j'en publie une ici:

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

MISE À JOUR :

comme @Stephen R mentionné dans les commentaires, si vous voulez supprimer à la fois les barres obliques et les barres obliques inverses à la fois à la fin et à la tête d'une chaîne littérale, vous écrirez:

'\/\\/\/I am free\\///\\\\'.replace(/^[\\/]+|[\\/]+$/g, '') // returns 'I am free'
vdegenne
la source
C'est la vraie réponse!
Can PERK
2
Si vous souhaitez couper les barres obliques et les barres obliques inverses:.replace(/^[\\/]+|[\\/]+$/g, '')
Stephen R
3

Basé sur la réponse de @vdegenne ... comment se déshabiller:

Barre oblique de fin simple:

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

Slashs de fin simples ou consécutifs:

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

Barre oblique unique:

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

Barre oblique unique ou consécutive:

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

Barres de début et de fin simples:

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

Barres obliques simples ou consécutives au début et à la fin:

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

Pour gérer à la fois les barres obliques et les barres obliques inverses, remplacez les instances de \/par[\\/]

Stephen R
la source
2

La façon la plus simple que je connais est la suivante

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

Cela vérifiera alors un / à la fin et si c'est là, supprimez-le si ce n'est pas le cas, votre chaîne retournera telle quelle

Juste une chose sur laquelle je ne peux pas encore commenter @ThiefMaster wow vous ne vous souciez pas de la mémoire, lol exécutez-vous un substr juste pour un si?

Correction du calucation pour l'index de base zéro sur la chaîne.

Barkermn01
la source
2

Voici un petit exemple d'URL.

var currentUrl = location.href;

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

enregistrer la nouvelle URL

console.log(currentUrl);
DevJ3rry
la source
1
function stripTrailingSlash(text) {
    return text
        .split('/')
        .filter(Boolean)
        .join('/');
}

une autre solution.

Доширак
la source
-11
function someFunction(site) {
  if (site.indexOf('/') > 0)
    return site.substring(0, site.indexOf('/'));
  return site;
}
josh.trow
la source
2
subtring? En plus de cela, il supprime la première barre oblique et tout ce qui suit.
ThiefMaster
@ThiefMaster: Vraiment? Vous ne pouvez pas dire ce que je voulais dire substring? Aussi oui, je voulais supprimer la première barre oblique et tout ce qui suit car elle remplit la facture pour la question et les exemples de données publiés.
josh.trow
Eh bien, son commentaire dit qu'il veut supprimer la barre oblique de fin
ThiefMaster
@ThiefMaster: Ce que, selon ses exemples, fait mon code.
josh.trow
1
Juste un pas pourquoi ne pas l'utiliser à tout moment si les URL changent pour être "pleinement qualifiés" ont http: // cela ne fonctionnera pas et tout lien avec / au milieu ne fonctionnera pas pour les googleurs
Barkermn01