Javascript equivalente ao PHP Explode ()

353

Eu tenho esta string:

0000000020C90037: TEMP: dados

Eu preciso dessa string:

TEMP: dados.

Com o PHP, eu faria o seguinte:

$str = '0000000020C90037:TEMP:data';
$arr = explode(':', $str);
$var = $arr[1].':'.$arr[2];

Como efetivamente faço explodeuma string em JavaScript da maneira que funciona em PHP?

Doug Molineux
fonte

Respostas:

607

Esta é uma conversão direta do seu código PHP:

//Loading the variable
var mystr = '0000000020C90037:TEMP:data';

//Splitting it with : as the separator
var myarr = mystr.split(":");

//Then read the values from the array where 0 is the first
//Since we skipped the first element in the array, we start at 1
var myvar = myarr[1] + ":" + myarr[2];

// Show the resulting value
console.log(myvar);
// 'TEMP:data'
John Hartsock
fonte
75
Note-se que a matriz começa em [0]
Herr
52
@ Herr Kaleun ... Isso é entendido ... Mas o OP queria os dois últimos itens da matriz.
John Hartsock
4
+1: está correto; Aqui está um link do MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . E o "oposto" direção, então o equivalente PHP implode () é myArray.join ( ':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
Sk8erPeter
12
NOTA : split(delimiter,limit)O parâmetro de limite NÃO funciona da mesma forma que explode($delimiter,$string,$limit)o parâmetro de limite. Exemplo: explode('.','1.2.3.4',3) === array('1','2','3.4')- enquanto em Javascript, você vai ter: '1.2.3.4'.split('.',3) === ['1', '2', '3']. Alguém sabe como replicar facilmente o método PHP?
Nathan JB
11
Eu adicionei comentários de código para limpar a matriz [0] coisas, poderia ser confuso os novatos ...
NDM
46

Você não precisa se separar. Você pode usar indexOfe substr:

str = str.substr(str.indexOf(':')+1);

Mas o equivalente a explodeseria split.

Felix Kling
fonte
5
Alguém provavelmente pensou que você estava sendo irritante. Às vezes você tem que explicar tudo. Por exemplo, "Seu problema é melhor resolvido por 'indexOf' ... mas 'split' responde sua pergunta literalmente".
Joel Mellon
Downvoter: "Como você ousa fornecer uma solução mais simples e com melhor desempenho em vez de validar meus preconceitos?"
jchook
37
String.prototype.explode = function (separator, limit)
{
    const array = this.split(separator);
    if (limit !== undefined && array.length >= limit)
    {
        array.push(array.splice(limit - 1).join(separator));
    }
    return array;
};

Deve imitar exatamente a função explode () do PHP.

'a'.explode('.', 2); // ['a']
'a.b'.explode('.', 2); // ['a', 'b']
'a.b.c'.explode('.', 2); // ['a', 'b.c']
psicopata brm
fonte
7
Parabéns por ser o ÚNICO , até onde posso ver, para fornecer um equivalente REAL à funcionalidade de explosão do PHP (conforme a pergunta original).
faazshift
11
Que solução simples e elegante, desejo que essa seja a resposta aceita.
Soger 07/07
28

Parece que você quer dividir

Quentin
fonte
9

Tente o seguinte:

arr = str.split (":");
weltraumpirat
fonte
6

create é um objeto:

// create a data object to store the information below.
    var data   = new Object();
// this could be a suffix of a url string. 
    var string = "?id=5&first=John&last=Doe";
// this will now loop through the string and pull out key value pairs seperated 
// by the & character as a combined string, in addition it passes up the ? mark
    var pairs = string.substring(string.indexOf('?')+1).split('&');
    for(var key in pairs)
    {
        var value = pairs[key].split("=");
        data[value[0]] = value[1];
    }

// creates this object 
    var data = {"id":"5", "first":"John", "last":"Doe"};

// you can then access the data like this
    data.id    = "5";
    data.first = "John";
    data.last  = "Doe";
JM Design
fonte
7
Parece um pouco exagerado, ty para a resposta tho
Doug Molineux
4

Use String.split

"0000000020C90037:TEMP:data".split(':')

Rumm alemão
fonte
4

Se você gosta de php, dê uma olhada no php.JS - JavaScript explode

Ou na funcionalidade normal do JavaScript: `

var vInputString = "0000000020C90037:TEMP:data";
var vArray = vInputString.split(":");
var vRes = vArray[1] + ":" + vArray[2]; `
eriksv88
fonte
Eu queria olhar para ela, mas só fiquei com o JavaScript confuso na minha frente. Uhm emptyArray = { 0: '' }? : - /
Marcel Korpel
Eu não disse que é a melhor solução, mas é uma boa solução se você é novo no JavScript e está familiarizado com o php. Mas havia uma razão pela qual escrevi outro exemplo. :) "
Seja
Isso parece razoável, mas acho que não se deve querer transformar uma linguagem de programação em outra; isso pode ser enganoso para os novatos que podem pensar que OOP em JavaScript é como OOP em C ++. Além disso, alguém pode simplesmente copiar e colar a função vinculada e pensar que é preciso definir matrizes dessa maneira.
Marcel Korpel
Sim, concordo completamente lá! Mas não está realmente colocando o código em suas mãos. e é isso. Se ele conhece php, talvez ele sinta falta de pequenas coisas em php. É a melhor lógica que estou me referindo à lógica, não como uma solução de cópia pastéis, nunca há uma boa solução! Minha experiência é que o dia em que percebe que tem muito a aprender, é quando você está no caminho certo.
eriksv88
+1 Até onde eu sei, esta é a única solução que funciona da mesma forma que o PHP. Se o delimitador não for encontrado, o resultado será a string original. explode('foo','bar'); // 'bar'Foi por isso que cheguei aqui e para meus propósitos um script de copiar e colar que pretendo usar com limites é absolutamente perfeito. Não preciso ficar de fora para criar o meu. Por que reinventar a roda afinal, beijo
Andy Gee
4

console.log(('0000000020C90037:TEMP:data').split(":").slice(1).join(':'))

saídas: TEMP:data

  • .split () desmontará uma string em partes
  • .join () remonta a matriz de volta a uma string
  • quando você deseja que o array sem o primeiro item, use .slice (1)
exebook
fonte
Esta resposta deve ter 554 votos positivos, não a resposta aceita. Além disso, nos últimos 3 anos, a resposta aceita foi completamente errado , concatenando índices 0 e 1 quando o OP pediu 1 e 2.
NobleUplift
2

Sem nenhuma intenção de criticar John Hartsock , apenas para o caso de o número de delimitadores variar para qualquer pessoa que use o código fornecido, eu sugeriria formalmente que o usasse ...

var mystr = '0000000020C90037:TEMP:data';
var myarr = mystr.split(":");
var arrlen = myarr.length;
var myvar = myarr[arrlen-2] + ":" + myarr[arrlen-1];
dylan maxey
fonte
1
var str = '0000000020C90037:TEMP:data';    // str = "0000000020C90037:TEMP:data"
str = str.replace(/^[^:]+:/, "");          // str = "TEMP:data"
Ruben Kazumov
fonte
Resposta muito espirituosa. Eu me pergunto o quão bem ele funciona em comparação com uma divisão tradicional.
NobleUplift 31/10/19
1

Apenas um pequeno acréscimo à resposta do psycho brm (sua versão não funciona no IE <= 8). Este código é compatível com vários navegadores:

function explode (s, separator, limit)
{
    var arr = s.split(separator);
    if (limit) {
        arr.push(arr.splice(limit-1, (arr.length-(limit-1))).join(separator));
    }
    return arr;
}
Efi Nuhr
fonte
0

Então, eu sei que este post é bastante antigo, mas achei que poderia adicionar uma função que me ajudou ao longo dos anos. Por que não refazer a função de explosão usando split como mencionado acima? Bem, aqui está:

function explode(str,begin,end)
{
   t=str.split(begin);
   t=t[1].split(end);
   return t[0];
}

Essa função funciona bem se você estiver tentando obter valores entre dois valores. Por exemplo:

data='[value]insertdataherethatyouwanttoget[/value]';

Se você estiver interessado em obter as informações entre as duas [tags] "tags", poderá usar a função da seguinte maneira.

out=explode(data,'[value]','[/value]');
//Variable out would display the string: insertdataherethatyouwanttoget

Mas digamos que você não tenha essas "tags" úteis como o exemplo acima exibido. Não importa.

out=explode(data,'insert','wanttoget');
//Now out would display the string: dataherethatyou

Wana vê-lo em ação? Clique aqui .

Ramity
fonte
0
var str = "helloword~this~is~me";
var exploded = str.splice(~);

a variável explodida retornará matriz e você pode acessar elementos da matriz acessando-a true exploded [enésimo] em que enésimo é o índice do valor que você deseja obter

Abdullahi Mako Ayuba
fonte
2
Isso nem funciona! splice aceita 2 dígitos e seqüências de caracteres como parâmetros, não um ~(isso causa um erro de sintaxe). E a emenda não é para essa finalidade, é obter / retirar itens ou adicionar a uma matriz.
precisa saber é o seguinte
0

tente assim,

ans = str.split (":");

E você pode usar duas partes da string como,

ans [0] e ans [1]

meignanamoorthy ks
fonte
2
Talvez explique como isso difere da resposta aceita postada há 8 anos.
Lece
0

Eu usei cortar, dividir e juntar Você pode escrever apenas uma linha de código

      let arrys = (str.split(":").slice(1)).join(":");
Pharis Kahama
fonte
0

Se você deseja definir sua própria função, tente o seguinte:

function explode (delimiter, string, limit) {
  if (arguments.length < 2 ||
    typeof delimiter === 'undefined' ||
    typeof string === 'undefined') {
    return null
  }
  if (delimiter === '' ||
    delimiter === false ||
    delimiter === null) {
    return false
  }
  if (typeof delimiter === 'function' ||
    typeof delimiter === 'object' ||
    typeof string === 'function' ||
    typeof string === 'object') {
    return {
      0: ''
    }
  }
  if (delimiter === true) {
    delimiter = '1'
  }

  // Here we go...
  delimiter += ''
  string += ''

  var s = string.split(delimiter)

  if (typeof limit === 'undefined') return s

  // Support for limit
  if (limit === 0) limit = 1

  // Positive limit
  if (limit > 0) {
    if (limit >= s.length) {
      return s
    }
    return s
      .slice(0, limit - 1)
      .concat([s.slice(limit - 1)
        .join(delimiter)
      ])
  }

  // Negative limit
  if (-limit >= s.length) {
    return []
  }

  s.splice(s.length + limit)
  return s
}

Retirado de: http://locutus.io/php/strings/explode/

harish sharma
fonte
-1

O código de Felix Kling é dinâmico (ao contrário da resposta aceita), no entanto, o exemplo inicial é um terrível ponto de partida. Então, para demonstrar visualmente sua resposta (ele está apenas respondendo à pergunta) para quem quer qualidade e velocidade:

    var s = '1:2:3:4:5:6';
    console.log(s);
    s = s.substr(s.indexOf(':')+1);
    console.log(s);

John
fonte