Javascript Setara dengan PHP Explode ()

353

Saya punya string ini:

0000000020C90037: TEMP: data

Saya membutuhkan string ini:

TEMP: data.

Dengan PHP saya akan melakukan ini:

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

Bagaimana cara efektif explodestring dalam JavaScript cara kerjanya di PHP?

Doug Molineux
sumber

Jawaban:

607

Ini adalah konversi langsung dari kode PHP Anda:

//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
sumber
75
Perlu dicatat bahwa array dimulai pada [0]
Herr
52
@ Heer Kaleun ... Itu dimengerti ... Tapi OP menginginkan dua item terakhir dalam array.
John Hartsock
4
+1: Itu benar; inilah tautan dari MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . Dan arah "berlawanan", sehingga PHP implode () setara adalah myArray.join (':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Sk8erPeter
12
CATATAN : split(delimiter,limit)Parameter batas TIDAK bekerja sama dengan explode($delimiter,$string,$limit)parameter batas. Contoh: explode('.','1.2.3.4',3) === array('1','2','3.4')- sementara di Javascript, Anda akan mendapatkan: '1.2.3.4'.split('.',3) === ['1', '2', '3']. Adakah yang tahu cara mereplikasi metode PHP dengan mudah?
Nathan JB
1
Saya telah menambahkan komentar kode untuk menghapus hal-hal array [0], bisa membingungkan pemula ...
NDM
46

Anda tidak perlu berpisah. Anda dapat menggunakan indexOfdan substr:

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

Tapi setara dengan explodeitu split.

Felix Kling
sumber
5
Seseorang mungkin mengira Anda sedang sombong. Terkadang Anda harus menjelaskan semuanya. Misalnya, "Masalah Anda paling baik diselesaikan dengan 'indexOf' ... tetapi 'split' menjawab pertanyaan Anda secara harfiah."
Joel Mellon
Downvoter: " Beraninya Anda memberikan solusi yang lebih sederhana dan lebih banyak performan daripada memvalidasi konsepsi saya ??"
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;
};

Seharusnya meniru PHP's explode () berfungsi dengan tepat.

'a'.explode('.', 2); // ['a']
'a.b'.explode('.', 2); // ['a', 'b']
'a.b.c'.explode('.', 2); // ['a', 'b.c']
psiko brm
sumber
7
Kudos untuk menjadi SATU - SATUNYA , sejauh yang saya bisa lihat, untuk memberikan setara dengan fungsi meledak aktual PHP (sesuai pertanyaan awal).
faazshift
1
Solusi yang sederhana dan elegan, saya berharap ini adalah tanggapan yang diterima.
soger
28

Sepertinya Anda ingin berpisah

Quentin
sumber
9

Coba ini:

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

buat adalah objek:

// 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";
Desain JM
sumber
7
Tampaknya sedikit berlebihan, untuk tanggapannya
Doug Molineux
4

Gunakan String.split

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

Rumm Jerman
sumber
4

Jika Anda menyukai php, lihat di php.JS - JavaScript explode

Atau dalam fungsi JavaScript normal: `

var vInputString = "0000000020C90037:TEMP:data";
var vArray = vInputString.split(":");
var vRes = vArray[1] + ":" + vArray[2]; `
eriksv88
sumber
Saya ingin melihatnya, tetapi hanya ada JavaScript yang berantakan di depan saya. Uhm emptyArray = { 0: '' },? : - /
Marcel Korpel
Saya belum mengatakan bahwa ini adalah solusi terbaik, tetapi ini adalah solusi yang baik jika Anda baru mengenal JavScript dan terbiasa dengan php. Tetapi ada alasan mengapa saya menulis contoh lain. :) "Tetap bodoh, sederhana!";)
eriksv88
Kedengarannya masuk akal, tapi saya pikir seseorang tidak seharusnya ingin mengubah satu bahasa pemrograman menjadi yang lain; yang bisa menyesatkan pemula yang mungkin berpikir bahwa OOP di JavaScript seperti OOP di C ++. Selain itu, seseorang mungkin hanya menyalin-menyisipkan fungsi yang ditautkan dan berpikir bahwa seseorang harus mendefinisikan array seperti itu.
Marcel Korpel
Ya, sepenuhnya setuju di sana! Tapi itu tidak benar-benar mendapatkan kode ke tangannya. dan hanya itu. Jika dia tahu php, jadi mungkin dia melewatkan hal-hal kecil di php. Ini adalah logika terbaik yang saya maksudkan dengan logika, bukan sebagai solusi copy pastel, tidak pernah ada solusi yang baik! Pengalaman saya adalah hari menyadari bahwa ia harus banyak belajar, saat itulah Anda berada di jalur yang benar.
eriksv88
+1 Sejauh yang saya lihat ini adalah satu-satunya solusi yang fungsinya sama dengan PHP. Jika pembatas tidak ditemukan hasilnya adalah string asli. explode('foo','bar'); // 'bar'Ini adalah alasan saya tiba di sini dan untuk tujuan saya, copy dan paste skrip yang ingin saya gunakan dengan batasan benar-benar sempurna. Saya tidak harus disingkirkan untuk membuatnya sendiri. Lagipula, mengapa harus menciptakan kembali roda, ciuman
Andy Gee
4

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

output: TEMP:data

  • .split () akan membongkar sebuah string menjadi beberapa bagian
  • .join () merakit kembali array kembali ke string
  • ketika Anda menginginkan array tanpa item pertama, gunakan .slice (1)
exebook
sumber
Jawaban ini harus memiliki 554 upvotes, bukan jawaban yang diterima. Juga, selama 3 tahun terakhir jawaban yang diterima benar-benar salah , menggabungkan indeks 0 dan 1 ketika OP meminta 1 dan 2.
NobleUplift
2

Dengan tidak ada niat untuk mengkritik John Hartsock , kalau-kalau jumlah pembatas dapat bervariasi untuk siapa pun yang menggunakan kode yang diberikan, saya akan secara resmi menyarankan untuk menggunakan ini sebagai gantinya ...

var mystr = '0000000020C90037:TEMP:data';
var myarr = mystr.split(":");
var arrlen = myarr.length;
var myvar = myarr[arrlen-2] + ":" + myarr[arrlen-1];
dylan maxey
sumber
1
var str = '0000000020C90037:TEMP:data';    // str = "0000000020C90037:TEMP:data"
str = str.replace(/^[^:]+:/, "");          // str = "TEMP:data"
Ruben Kazumov
sumber
Jawaban yang sangat lucu. Saya bertanya-tanya seberapa baik kinerjanya dibandingkan dengan split tradisional.
NobleUplift
1

Hanya sedikit tambahan jawaban psiko brm (versinya tidak berfungsi di IE <= 8). Kode ini kompatibel lintas-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;
}
Efi Nuhr
sumber
0

Jadi saya tahu bahwa posting ini cukup lama, tetapi saya pikir saya mungkin juga menambahkan fungsi yang telah membantu saya selama bertahun-tahun. Mengapa tidak membuat ulang fungsi meledak menggunakan split seperti yang disebutkan di atas? Nah ini dia:

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

Fungsi ini berfungsi dengan baik jika Anda mencoba untuk mendapatkan nilai di antara dua nilai. Contohnya:

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

Jika Anda tertarik untuk mendapatkan informasi dari kedua [nilai] "tag", Anda dapat menggunakan fungsi seperti berikut.

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

Tetapi katakanlah Anda tidak memiliki "tag" praktis seperti contoh di atas yang ditampilkan. Tidak penting.

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

Wana melihatnya beraksi? Klik di sini .

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

variabel yang meledak akan mengembalikan array dan Anda dapat mengakses elemen array yang mengaksesnya benar meledak [ke-n] di mana ke-n adalah indeks dari nilai yang ingin Anda dapatkan

Abdullahi Mako Ayuba
sumber
2
Ini bahkan tidak berhasil! splice menerima 2 digit dan string sebagai parameter, bukan a ~(ini menyebabkan kesalahan sintaksis). Dan sambatan bukan untuk tujuan ini, itu untuk mendapatkan / mengambil item dari atau menambah array.
CPHPython
0

coba seperti ini,

ans = str.split (":");

Dan Anda dapat menggunakan dua bagian dari string seperti,

ans [0] dan ans [1]

meignanamoorthy ks
sumber
2
Mungkin menjelaskan bagaimana ini berbeda dari jawaban yang diterima yang diposting 8 tahun yang lalu.
Lece
0

Saya menggunakan slice, split, dan join. Anda cukup menulis satu baris kode

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

Jika Anda ingin mendefinisikan fungsi Anda sendiri, coba ini:

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
}

Diambil dari: http://locutus.io/php/strings/explode/

harish sharma
sumber
-1

Kode Felix Kling bersifat dinamis (tidak seperti jawaban yang diterima) namun string contoh awal adalah titik awal yang mengerikan. Jadi untuk secara visual menunjukkan jawabannya (dia hanya menjawab pertanyaan) bagi mereka yang menginginkan kualitas dan kecepatan:

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

John
sumber