¿Cómo obtener el nombre de la última carpeta de la ruta de la carpeta en javascript?

4 minutos de lectura

En javascript/jquery, dada una ruta a una carpeta como:

"http://www.blah/foo/bar/" 

o

"http://www.blah/foo/bar" (this one doesn't have a slash in the end)

¿Cómo se puede extraer el nombre de la última carpeta? En este caso sería "bar".

¿Hay una manera fácil a través de una función incorporada?

Gracias.

Avatar de usuario de Denys Séguret
Denys Séguret

Usa el poder de la expresión regular:

var name = path.match(/([^\/]*)\/*$/)[1]

Tenga en cuenta que esta no es la última “carpeta” (que no está definida en su caso y en el caso general de una URL), sino el último token de ruta.

  • esto regresará bar/ si el camino tiene / al final

    – Adil Shaikh

    22 de mayo de 2013 a las 15:13

  • @pXL arreglado (copiar y pegar mal)

    – Denys Séguret

    22 de mayo de 2013 a las 15:14

  • Nota: (El título dice: “Cómo obtener el nombre de la última carpeta”) Lo anterior devolverá about.html por ejemplo: /foo/bar/about.html

    – Roko C. Bulján

    16/09/2014 a las 14:33

  • @RokoC.Buljan Cierto. Pero creo que esto fue lo que pidió OP.

    – Denys Séguret

    16/09/2014 a las 14:36

  • @dystroy sí dame5! No fue una crítica, solo una NÓTESE BIEN 🙂

    – Roko C. Bulján

    16/09/2014 a las 14:37


Avatar de usuario de David Fregoli
david fregoli

¡Usa expresiones regulares! o:

var arr="http://www.blah/foo/bar/".split("https://stackoverflow.com/");
var last = arr[arr.length-1] || arr[arr.length-2];

esto da cuenta de ‘http://www.blah/foo/bar////‘ :p (o bloquea el navegador)

var arr="http://www.blah/foo/bar/////".split("https://stackoverflow.com/");
var last = (function trololol(i) {
  return arr[i] || trololol(i-1);
})(arr.length-1);

  • funcion recursiva entonces :p

    – David Fregoli

    22 de mayo de 2013 a las 15:12

  • @Matt Esto realmente no parece un camino. ¿Cuál debería ser el resultado?

    – Denys Séguret

    22 de mayo de 2013 a las 15:14


  • @dystroy eso poder ser una ruta (válida y funcional) en el lado del servidor y generar direcciones dinámicamente…

    usuario1823761

    22 de mayo de 2013 a las 15:16

  • @dystroy: fue principalmente un comentario alegre, pero supongo que una cadena vacía o la “barra”, cualquiera que sea el caso de uso de los OP. El formato aún funciona en la mayoría (¿todos?) de los servidores web. No estoy seguro si es parte de una especificación en alguna parte.

    – Mate

    22 mayo 2013 a las 15:20


  • Parece que le gustaría conocer las expresiones regulares. Una buena manera de aprender es mirar [regex] preguntas sobre SO e intenta encontrar la respuesta sin mirar las otras (al menos hasta que hayas intentado lo suficiente). En el proceso, será mejor que eches un vistazo a este sitio.

    – Denys Séguret

    22 de mayo de 2013 a las 16:02

Mira esto:

var lastFolder = location.href.split("https://stackoverflow.com/").filter(function(el) { 
    return el.trim().length > 0; 
}).pop();
alert( location.href.split("https://stackoverflow.com/").filter(function(el) { return el.trim().length > 0; }).pop() );
alert( location.href );

var test = "http://www.blah/foo/bar/" ;
alert( test.split("https://stackoverflow.com/").filter(function(el) { return el.trim().length > 0; }).pop() );

var myString = "http://www.blah/foo/bar";
var pathElements = myString.replace(/\/$/, '').split("https://stackoverflow.com/");
var lastFolder = pathElements[pathElements.length - 1];

Esto es JavaScript puro y no necesita jQuery.

Usualmente uso la combinación de split y pop en javascript, porque generalmente obtengo la dirección de la carpeta de aws s3, ya está limpia:

const teststring = 'image_1/ArtService/GB/ART-123/dependants/ASM-123';
const folder = teststring.split("https://stackoverflow.com/").pop();
console.log('folder:', folder);// ASM-123

Puede dividir la cadena en una lista y tomar el último elemento de la lista a través de una función.

function checkString(stringToCheck) {
    var list1 = stringToCheck.split("https://stackoverflow.com/");
    if (list1[list1.length - 1].length < 1) {
        var item = list1[list1.length - 2]
    } else {
       var item = list1[list1.length - 1];
    }
    $('#results').append('Last Folder in '+stringToCheck+': <b>'+item+'</b><br>');

}

Desde allí puede encontrar el último elemento real.

Ejemplo JSFiddle

Si bien puede que no sea la respuesta más elegante, parece ser la más fácil de entender para alguien que no conozca las expresiones regulares.

JSFiddle actualizado para mostrar los resultados.

var str = "...";
var segments = str.split("https://stackoverflow.com/");
var lastDir = (segments.length > 1) ? segments[segments.length - 2] : "";

El primer ejemplo produce “barra”. El segundo ejemplo produce “foo”.

Si desea ignorar la barra inclinada final y considerar el último segmento como una carpeta también, entonces un ligero ajuste a RegExp de @bdesham es el truco:

var segments = str.replace(/\/+$/, '').split("https://stackoverflow.com/");
var lastDir = (segments.length > 0) ? segments[segments.length - 1] : "";

  • Formateé tu respuesta por ti. Mire los botones en la barra de herramientas al editar.

    – Denys Séguret

    22 mayo 2013 a las 15:20

  • @dystroy Gracias, supongo que arruiné el descuento de GitHub.

    – LexLythius

    22 de mayo de 2013 a las 15:28

  • Creo que lo que quiere hacer no es correcto, ya que la barra diagonal final significa que el último segmento es un directorio (la única forma sintáctica real de decir carpetas y archivos de appart) y eso puede causarle problemas si hace algo RESTful con este. Aunque editaré mi respuesta

    – LexLythius

    22 mayo 2013 a las 22:46

¿Ha sido útil esta solución?