Javascript equivalente a PHP Explode ()


353

Ho questa stringa:

0000000020C90037: TEMP: i dati

Ho bisogno di questa stringa:

TEMP: i dati.

Con PHP farei questo:

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

Come effettuo explodeuna stringa in JavaScript come funziona in PHP?

Risposte:


607

Questa è una conversione diretta dal tuo codice 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'

75
va notato che l'array inizia alle [0]
Herr

52
@Herr Kaleun ... Questo è chiaro ... Ma OP voleva gli ultimi due elementi dell'array.
John Hartsock,

4
+1: è corretto; ecco un link da MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . E la direzione "opposta", quindi l'equivalente implode () di PHP è myArray.join (':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Sk8erPeter

12
NOTA : split(delimiter,limit)il parametro limite NON funziona allo stesso modo explode($delimiter,$string,$limit)del parametro limite. Esempio: explode('.','1.2.3.4',3) === array('1','2','3.4')- mentre in Javascript, si otterrà: '1.2.3.4'.split('.',3) === ['1', '2', '3']. Qualcuno sa come replicare facilmente il metodo di PHP?
Nathan JB,

1
Ho aggiunto un commento in codice per chiarire le cose dell'array [0], potrebbe confondere i neofiti ...
NDM,

46

Non è necessario dividere. Puoi usare indexOfe substr:

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

Ma l'equivalente explodesarebbe split.


5
Qualcuno probabilmente pensava che tu fossi stato snarky. A volte devi spiegare tutto. Ad esempio, "Il tuo problema è risolto al meglio con 'indexOf' ... ma 'split' risponde letteralmente alla tua domanda."
Joel Mellon,

Downvoter: "Come osi fornire una soluzione più semplice e performante invece di convalidare i miei preconcetti ??"
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;
};

Dovrebbe imitare esattamente la funzione explode () di PHP.

'a'.explode('.', 2); // ['a']
'a.b'.explode('.', 2); // ['a', 'b']
'a.b.c'.explode('.', 2); // ['a', 'b.c']

7
Complimenti per essere l' UNICO , per quanto posso vedere, a fornire un EFFETTIVO equivalente alla funzionalità di esplosione di PHP (secondo la domanda originale).
faazshift

1
Quale soluzione semplice ed elegante, vorrei che questa fosse la risposta accettata.
Soger,



6

creare è un oggetto:

// 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";

7
Sembra un po 'eccessivo, grazie per la risposta
Doug Molineux,


4

Se ti piace php, dai un'occhiata a php.JS - JavaScript esplode

O nella normale funzionalità JavaScript: `

var vInputString = "0000000020C90037:TEMP:data";
var vArray = vInputString.split(":");
var vRes = vArray[1] + ":" + vArray[2]; `

Volevo guardarla, ma ho solo JavaScript confuso davanti a me. Uhm, emptyArray = { 0: '' }? : - /
Marcel Korpel il

Non ho detto che è la soluzione migliore, ma è una buona soluzione se sei nuovo su JavScript e hai familiarità con php. Ma c'era un motivo per cui ho scritto un altro esempio. :) "Keep it simple stupid!";)
eriksv88

Sembra ragionevole, ma penso che uno non dovrebbe voler trasformare un linguaggio di programmazione in un altro; potrebbe essere fuorviante per i neofiti che potrebbero pensare che OOP in JavaScript sia come OOP in C ++. Inoltre, qualcuno potrebbe semplicemente copiare e incollare la funzione collegata e pensare che si debbano definire array in quel modo.
Marcel Korpel,

Sì, completamente d'accordo lì! Ma non sta davvero prendendo il codice in mano. e basta. Se conosce php, quindi forse gli mancano piccole cose in php. È la migliore logica che mi riferisco alla logica, non come una soluzione di copia pastelli, non c'è mai una buona soluzione! La mia esperienza è che il giorno in cui ho capito che ha molto da imparare, è quando sei sulla strada giusta.
eriksv88,

+1 Per quanto posso vedere questa è l'unica soluzione che funziona allo stesso modo di PHP. Se il delimitatore non viene trovato, il risultato è la stringa originale. explode('foo','bar'); // 'bar'Questo è il motivo per cui sono arrivato qui e per i miei scopi è assolutamente perfetto uno script copia e incolla che intendo utilizzare con limiti. Non devo essere messo da parte nel creare il mio. Perché reinventare la ruota dopo tutto, bacio
Andy Gee,

4

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

uscite: TEMP:data

  • .split () disassemblerà una stringa in parti
  • .join () riassembla l'array in una stringa
  • quando vuoi l'array senza il suo primo elemento, usa .slice (1)

Questa risposta dovrebbe avere 554 voti, non la risposta accettata. Inoltre, negli ultimi 3 anni la risposta accettata è stata completamente sbagliata , concatenando gli indici 0 e 1 quando il PO ha chiesto 1 e 2.
NobleUplift

2

Senza alcuna intenzione di criticare John Hartsock , nel caso in cui il numero di delimitatori possa variare per chiunque utilizzi il codice dato, suggerirei formalmente di usarlo invece ...

var mystr = '0000000020C90037:TEMP:data';
var myarr = mystr.split(":");
var arrlen = myarr.length;
var myvar = myarr[arrlen-2] + ":" + myarr[arrlen-1];

1
var str = '0000000020C90037:TEMP:data';    // str = "0000000020C90037:TEMP:data"
str = str.replace(/^[^:]+:/, "");          // str = "TEMP:data"

Risposta molto spiritosa. Mi chiedo quanto funzioni bene rispetto a una divisione tradizionale.
NobleUplift,

1

Solo una piccola aggiunta alla risposta di psycho brm (la sua versione non funziona in IE <= 8). Questo codice è compatibile con più browser:

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

0

Quindi so che questo post è piuttosto vecchio, ma ho pensato che potrei anche aggiungere una funzione che mi ha aiutato negli anni. Perché non rifare la funzione esplodi usando split come menzionato sopra? Bene eccolo qui:

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

Questa funzione funziona bene se stai cercando di ottenere valori tra due valori. Per esempio:

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

Se si fosse interessati a ottenere le informazioni tra i due [valori] "tag", è possibile utilizzare la funzione come la seguente.

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

Ma supponiamo che tu non abbia quei "tag" a portata di mano come nell'esempio sopra visualizzato. Non importa.

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

Wana lo vedi in azione? Clicca qui .


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

la variabile esplosa restituirà un array e puoi accedere ad elementi dell'array accedendo ad esso vero esploso [nth] dove nth è l'indice del valore che vuoi ottenere


2
Questo non funziona nemmeno! splice accetta 2 cifre e stringhe come parametri, non un ~(questo causa un errore di sintassi). E la giunzione non è per questo scopo, è per ottenere / estrarre oggetti da o aggiungere ad un array.
CPHPython,

0

prova così,

ans = str.split (":");

E puoi usare due parti della stringa come,

ans [0] e ans [1]


2
Forse spiegare in che modo differisce dalla risposta accettata pubblicata 8 anni fa.
Lece,

0

Ho usato slice, split e join. Puoi semplicemente scrivere una riga di codice

      let arrys = (str.split(":").slice(1)).join(":");

0

Se vuoi definire la tua funzione, prova questo:

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
}

Tratto da: http://locutus.io/php/strings/explode/


-1

Il codice di Felix Kling è dinamico (a differenza della risposta accettata), tuttavia la stringa di esempio iniziale è un terribile punto di partenza. Quindi per dimostrare visivamente la sua risposta (sta solo rispondendo alla domanda) per coloro che vogliono qualità e velocità:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.