JavaScript Odpowiednik PHP Explode ()


353

Mam ten ciąg:

0000000020C90037: TEMP: dane

Potrzebuję tego ciągu:

TEMP: dane.

Z PHP zrobiłbym to:

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

Jak skutecznie explodenapisać ciąg w JavaScript, tak jak działa w PHP?

Odpowiedzi:


607

To jest bezpośrednia konwersja z twojego kodu 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
należy zauważyć, że tablica zaczyna się od [0]
Herr

52
@Herr Kaleun ... To zrozumiałe ... Ale OP chciał dwa ostatnie elementy w tablicy.
John Hartsock

4
+1: Zgadza się; oto link z MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . I w przeciwnym kierunku, więc odpowiednikiem implode () PHP jest myArray.join (':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Sk8erPeter

12
UWAGA : split(delimiter,limit)parametr limitu NIE działa tak samo jak explode($delimiter,$string,$limit)parametr limitu. Przykład: explode('.','1.2.3.4',3) === array('1','2','3.4')- podczas gdy w JavaScript, dostaniesz: '1.2.3.4'.split('.',3) === ['1', '2', '3']. Czy ktoś wie, jak łatwo powielić metodę PHP?
Nathan JB

1
Dodałem komentarze do kodu, aby wyczyścić tablicę [0], może wprowadzać w błąd początkujących ...
NDM

46

Nie musisz się dzielić. Możesz użyć indexOfi substr:

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

Ale odpowiednikiem explodebyłoby split.


5
Ktoś prawdopodobnie myślał, że jesteś wredny. Czasami musisz wszystko wyjaśnić. Np. „Twój problem najlepiej rozwiązać poprzez„ indexOf ”... ale„ split ”dosłownie odpowiada na twoje pytanie.”
Joel Mellon

Downvoter: „Jak śmiesz zapewniać prostsze i wydajniejsze rozwiązanie zamiast weryfikować moje uprzedzenia?”
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;
};

Powinien dokładnie naśladować funkcję explode () PHP.

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

7
Uznanie za bycie JEDYNYM , o ile widzę, dostarczenie RZECZYWISTEGO odpowiednika funkcji eksplozji PHP (zgodnie z pierwotnym pytaniem).
faazshift

1
Cóż za proste i eleganckie rozwiązanie, chciałbym, żeby to była zaakceptowana odpowiedź.
soger



6

create jest obiektem:

// 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
Wydaje się to trochę przesadne, jednak za odpowiedź
Doug Molineux


4

Jeśli lubisz php, spójrz na php.JS - JavaScript eksploduje

Lub w normalnej funkcjonalności JavaScript: `

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

Chciałem na nią spojrzeć, ale przede mną dostałem bałagan w JavaScript. Uhm, emptyArray = { 0: '' }? : - /
Marcel Korpel,

Nie powiedziałem, że jest to najlepsze rozwiązanie, ale jest to dobre rozwiązanie, jeśli jesteś nowy w JavScript i znasz php. Ale był powód, dla którego napisałem inny przykład. :) „Niech to będzie głupie!”;)
eriksv88,

Brzmi rozsądnie, ale myślę, że nie należy przekształcać jednego języka programowania w inny; może to być mylące dla początkujących, którzy mogą myśleć, że OOP w JavaScript jest jak OOP w C ++. Co więcej, ktoś może po prostu skopiować wklejoną funkcję i pomyśleć, że trzeba w ten sposób zdefiniować tablice.
Marcel Korpel,

Tak, całkowicie się z tym zgódź! Ale tak naprawdę nie dostaje kodu w jego ręce. i to wszystko. Jeśli zna php, to może tęskni za małymi rzeczami w php. Najlepsza logika Mam na myśli logikę, a nie rozwiązanie kopiowania pasteli, nigdy nie ma dobrego rozwiązania! Z mojego doświadczenia wynika, że ​​w dniu, w którym zdajesz sobie sprawę, że trzeba się wiele nauczyć, wtedy jesteś na dobrej drodze.
eriksv88,

+1 O ile widzę, jest to jedyne rozwiązanie, które działa tak samo jak PHP. Jeśli ogranicznik nie zostanie znaleziony, wynikiem będzie oryginalny ciąg znaków. explode('foo','bar'); // 'bar'To jest powód, dla którego tu przybyłem i dla moich celów skrypt kopiuj i wklej, którego zamierzam używać z ograniczeniami, jest absolutnie doskonały. Nie muszę dać się wciągnąć w tworzenie własnego. Po co w końcu wymyślać koło, pocałuj
Andy Gee,

4

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

wyjścia: TEMP:data

  • .split () rozłoży ciąg na części
  • .join () ponownie składa tablicę z powrotem na ciąg
  • jeśli chcesz tablicy bez jej pierwszego elementu, użyj .slice (1)

Ta odpowiedź powinna mieć 554 głosów pozytywnych, a nie zaakceptowaną. Ponadto przez ostatnie 3 lata zaakceptowana odpowiedź była całkowicie błędna , łącząc wskaźniki 0 i 1, gdy OP poprosił o 1 i 2.
NobleUplift

2

Bez zamiaru krytykowania Johna Hartsocka , na wypadek gdyby liczba ograniczników mogła się różnić dla każdego, kto używa tego kodu, formalnie sugeruję użycie tego zamiast ...

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"

Bardzo dowcipna odpowiedź. Zastanawiam się, jak dobrze sobie radzi w porównaniu do tradycyjnego podziału.
NobleUplift

1

Tylko mały dodatek do odpowiedzi psycho brm (jego wersja nie działa w IE <= 8). Ten kod jest kompatybilny z różnymi przeglądarkami:

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

Wiem, że ten post jest dość stary, ale pomyślałem, że równie dobrze mogę dodać funkcję, która pomogła mi przez lata. Dlaczego po prostu nie przerobić funkcji rozstrzelenia przy użyciu podziału, jak wspomniano powyżej? Cóż, oto:

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

Ta funkcja działa dobrze, jeśli próbujesz uzyskać wartości między dwiema wartościami. Na przykład:

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

Jeśli chciałbyś uzyskać informacje pomiędzy dwoma „znacznikami” [wartości], możesz użyć tej funkcji w następujący sposób.

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

Powiedzmy jednak, że nie masz tych przydatnych „tagów”, jak w powyższym przykładzie. Bez znaczenia.

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

Chcesz zobaczyć to w akcji? Kliknij tutaj .


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

zmienna rozstrzelona zwróci tablicę i możesz uzyskać dostęp do elementów tablicy, dostęp do niej prawda rozstrzelona [n-ty] gdzie n-ty jest indeksem wartości, którą chcesz uzyskać


2
To nawet nie działa! splice akceptuje 2 cyfry i ciągi jako parametry, a nie a ~(powoduje to błąd składniowy). I składania nie jest do tego celu, jest to, aby uzyskać / wyjąć elementy z lub dodać do tablicy.
CPHPython

0

spróbuj tak

ans = str.split (":");

I możesz użyć dwóch części sznurka, takich jak:

ans [0] i ans [1]


2
Być może wyjaśnij, czym różni się to od zaakceptowanej odpowiedzi opublikowanej 8 lat temu.
Lece

0

Użyłem wycinania, dzielenia i łączenia Możesz napisać tylko jedną linię kodu

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

0

Jeśli chcesz zdefiniować własną funkcję, spróbuj tego:

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
}

Zaczerpnięte z: http://locutus.io/php/strings/explode/


-1

Kod Feliksa Klinga jest dynamiczny (w przeciwieństwie do przyjętej odpowiedzi), jednak początkowy przykładowy ciąg znaków jest okropnym punktem wyjścia. Aby wizualnie zademonstrować swoją odpowiedź (po prostu odpowiada na pytanie) dla tych, którzy chcą jakości i szybkości:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.