Devolver cadena sin barra diagonal


196

Tengo dos variables:

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

Quiero hacer algo como esto

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

¿Cómo hago esto?


Respuestas:


480

Prueba esto:

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

122
Para manejar casos con múltiples barras diagonales finales, puede usar:return site.replace(/\/+$/, "");
mikermcneil

13
"/".replace(/\/$/," ") será" ". "/" es una ruta válida y no debe ser eliminada.
puchu

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

Nota: IE8 y versiones anteriores no son compatibles con compensaciones de substr negativas. Úselo str.length - 1en su lugar si necesita admitir esos navegadores antiguos.


Realmente me gusta el uso del término 'antiguo' aquí.
PageSource

48

ES6 / ES2015 proporciona una API para preguntar si una cadena termina con algo, lo que permite escribir una función más limpia y legible.

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

3
mejor solución en 2019 🤙
Paul Rad

@PaulRad Al usar esta solución, el problema de la rama str.slice (0, -1) no está cubierto para esta línea en la prueba unitaria. ¿Cómo arreglar eso?
Bijay Rai

30

Yo usaría una expresión 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 ($)
}

Sin siteembargo, querrás asegurarte de que la variable sea ​​una cadena.


3
Estoy totalmente de acuerdo, cada vez que escriba regex, debe estar envuelto en una función con un nombre descriptivo o con comentarios.
Eric Labashosky

12

Este fragmento es más preciso:

str.replace(/^(.+?)\/*?$/, "$1");
  1. No despoja /cadenas, ya que es una url válida.
  2. Pela cadenas con múltiples barras diagonales.

Si bien este puede ser un enfoque válido para eliminar múltiples barras, esa no es la solicitud del OP.
Jon L.

@JonL. Muchas personas navegan por el desbordamiento de pila para encontrar la respuesta. Encuentro útil esta respuesta que la respuesta aceptada.
Ronnel Martinez

@JonL. Muchas personas navegan por el desbordamiento de pila para encontrar la respuesta. Encuentro útil esta respuesta que la respuesta aceptada.
Ronnel Martinez

10

Sé que la pregunta es sobre barras diagonales finales, pero encontré esta publicación durante mi búsqueda de barras diagonales (tanto en la cola como en la cabeza de un literal de cadena), ya que la gente necesitaría esta solución. Estoy publicando una aquí:

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

ACTUALIZACIÓN :

como @Stephen R mencionó en los comentarios, si desea eliminar las barras diagonales y las barras diagonales inversas tanto en la cola como en la cabeza de un literal de cadena, escribiría:

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

Esta es la verdadera respuesta!
Puede PERK

1
Si desea recortar tanto las barras como las barras invertidas:.replace(/^[\\/]+|[\\/]+$/g, '')
Stephen R

2

La forma más fácil que conozco es esta

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

Esto verificará si hay un / al final y si está allí, elimínelo, si no lo está, devolverá su cadena como estaba

Solo una cosa que no puedo comentar todavía @ThiefMaster wow, no te importa la memoria ¿lol runnign un substr solo por un if?

Se corrigió la clasificación para el índice basado en cero en la cadena.


2

Aquí un pequeño ejemplo de URL.

var currentUrl = location.href;

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

registrar la nueva url

console.log(currentUrl);

2

Basado en la respuesta de @vdegenne ... cómo despojar:

Barra inclinada final simple:

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

Barras finales simples o consecutivas:

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

Barra diagonal única:

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

Barras iniciales simples o consecutivas:

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

Barras iniciales y finales simples:

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

Barras iniciales y finales simples o consecutivas:

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

Para manejar ambas barras y traseros barras, reemplace las instancias de \/la[\\/]


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

otra solución.


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

2
subtring? Además de eso, elimina la primera barra y todo lo que sigue.
ThiefMaster

@ ThhiefMaster: ¿En serio? ¿No puedes decir que quise decir substring? También sí, quise eliminar la primera barra oblicua y todo lo siguiente, ya que llena la factura de la pregunta y los datos de ejemplo publicados.
josh.trow

Bueno, su comentario dice que quiere eliminar la barra diagonal
ThiefMaster

@ ThhiefMaster: que, según sus ejemplos, mi código sí.
josh.trow

1
Solo por qué no usar esto en cualquier momento si las URL cambian para ser "completamente calificado" tienen http: // esto no funcionará y cualquier enlace con / en el medio no funcionará para googlers
Barkermn01
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.