Obtém o valor de uma string após uma barra em JavaScript

112

Já estou tentando há mais de uma hora e não consigo descobrir a maneira certa de fazer isso, embora provavelmente seja muito fácil:

Eu tenho algo assim: foo/bar/test.html

Eu gostaria de usar o jQuery para extrair tudo depois do último /. No exemplo acima, a saída seria test.html.

Eu acho que pode ser feito usando substr e indexOf(), mas não consigo encontrar uma solução que funcione.

r0skar
fonte

Respostas:

243

Pelo menos três maneiras:

Uma expressão regular:

var result = /[^/]*$/.exec("foo/bar/test.html")[0];

... que diz "pegue a série de caracteres que não contém uma barra" ( [^/]*) no final da string ( $). Em seguida, ele captura os caracteres correspondentes do objeto de correspondência retornado, indexando nele ( [0]); em um objeto de correspondência, a primeira entrada é toda a string correspondida. Não há necessidade de grupos de captura.

Exemplo vivo

Usando lastIndexOfe substring:

var str = "foo/bar/test.html";
var n = str.lastIndexOf('/');
var result = str.substring(n + 1);

lastIndexOffaz o que parece que faz: encontra o índice da última ocorrência de um caractere (bem, string) em uma string, retornando -1 se não for encontrado. Nove em cada dez vezes, você provavelmente deseja verificar o valor de retorno ( if (n !== -1)), mas acima, uma vez que estamos adicionando 1 a ele e chamando a substring, acabaríamos fazendo o str.substring(0)que apenas retorna a string.

Usando Array#split

Sudhir e Tom Walters cobrem isso aqui e aqui , mas apenas para completar:

var parts = "foo/bar/test.html".split("/");
var result = parts[parts.length - 1]; // Or parts.pop();

split divide uma string usando o delimitador fornecido, retornando uma matriz.

A solução lastIndexOf/ substringé provavelmente a mais eficiente (embora seja sempre necessário ter cuidado ao dizer qualquer coisa sobre JavaScript e desempenho, uma vez que os motores variam tão radicalmente um do outro), mas a menos que você esteja fazendo isso milhares de vezes em um loop, não não importa e eu lutaria pela clareza do código.

TJ Crowder
fonte
1
Como você adaptaria isso para retornar a string antes da barra final? (
Ou
28

Você não precisa do jQuery, e existem várias maneiras de fazer isso, por exemplo:

var parts = myString.split('/');
var answer = parts[parts.length - 1];

Onde myString contém sua string.

Tom Walters
fonte
3
1 (para trabalhar) apontando que jQuery não é a solução definitiva para problemas de javascript.
Andrew Jackman
1
Esta é uma solução com bugs, tente o que acontece se você adicionar a barra ao slug? Ele retorna 0. E o que acontece se não houver lesma? - retorna NaN! wtf? código incorreto
Donatas Cereska
1) A questão estava relacionada a uma entrada que não era nula 2) A entrada estava relacionada a entradas que terminam em nomes de arquivo (sem barras) 3) A resposta aceita é de fato uma solução muito melhor, daí os numerosos votos positivos 4) Você pode adicionar sua própria solução
Tom Walters
12
var str = "foo/bar/test.html";
var lastSlash = str.lastIndexOf("/");
alert(str.substring(lastSlash+1));
Kasdega
fonte
9

Experimentar;

var str = "foo / bar / test.html";
var tmp = str.split ("/");
alert (tmp.pop ());
Sudhir Bastakoti
fonte
5

Quando eu sei que a string vai ser razoavelmente curta, eu uso o seguinte liner ... (lembre-se de escapar das barras invertidas)

// if str is C:\windows\file system\path\picture name.jpg
alert( str.split('\\').pop() );

alerta aparece com picture name.jpg

DaveAlger
fonte
2
String path ="AnyDirectory/subFolder/last.htm";
int pos = path.lastIndexOf("/") + 1;

path.substring(pos, path.length()-pos) ;

Agora você tem o last.htm na string do caminho.

Zar E Ahmer
fonte
1

peso leve

string.substring(start,end)

Onde

start = Required. A posição onde iniciar a extração. O primeiro caractere está no índice 0`.

end = Optional. A posição (até, mas não incluindo) onde terminar a extração. Se omitido, ele extrai o resto da string.

    var string = "var1/var2/var3";

    start   = string.lastIndexOf('/');  //console.log(start); o/p:- 9
    end     = string.length;            //console.log(end);   o/p:- 14

    var string_before_last_slash = string.substring(0, start);
    console.log(string_before_last_slash);//o/p:- var1/var2

    var string_after_last_slash = string.substring(start+1, end);
    console.log(string_after_last_slash);//o/p:- var3

OU

    var string_after_last_slash = string.substring(start+1);
    console.log(string_after_last_slash);//o/p:- var3
Shailesh Sonare
fonte
1

Jquery:

var afterDot = value.substr(value.lastIndexOf('_') + 1);

Javascript:

var myString = 'asd/f/df/xc/asd/test.jpg'
var parts    = myString.split('/');
var answer   = parts[parts.length - 1];
console.log(answer);

Substitua '_' || '/' para sua própria necessidade

SMPLYJR
fonte
1

Conforme exigido na pergunta:

var string1= "foo/bar/test.html";
  if(string1.contains("/"))
  {
      var string_parts = string1.split("/");
    var result = string_parts[string_parts.length - 1];
    console.log(result);
  }  

e para perguntas feitas no url (solicitadas para uma ocorrência de '=') ::
[ http://stackoverflow.com/questions/24156535/how-to-split-a-string-after-a-particular-character-in -jquery] [1]

var string1= "Hello how are =you";
  if(string1.contains("="))
  {
      var string_parts = string1.split("=");
    var result = string_parts[string_parts.length - 1];
    console.log(result);
  }
Vishal Kumar
fonte
0

Experimente isto:

const url = "files/images/gallery/image.jpg";

console.log(url.split("/").pop());

Patrycja Petryk
fonte
Esta solução já está na resposta aceita, como a terceira solução possível
β.εηοιτ.βε 03/06