Javascript tương đương với PHP Explode ()


353

Tôi có chuỗi này:

0000000020C90037: TEMP: dữ liệu

Tôi cần chuỗi này:

TEMP: dữ liệu.

Với PHP tôi sẽ làm điều này:

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

Làm thế nào để tôi có hiệu quả explodemột chuỗi trong JavaScript theo cách nó hoạt động trong PHP?

Câu trả lời:


607

Đây là một chuyển đổi trực tiếp từ mã PHP của bạn:

//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
cần lưu ý rằng mảng bắt đầu lúc [0]
Herr

52
@Herr Kaleun ... Điều đó được hiểu ... Nhưng OP muốn hai mục cuối cùng trong mảng.
John Hartsock

4
+1: Điều đó đúng; đây là một liên kết từ MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/ tựa . Và hướng "ngược lại", do đó, tương đương với PHP implode () là myArray.join (':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/
tựa

12
LƯU Ý : split(delimiter,limit)Tham số giới hạn của KHÔNG hoạt động giống như explode($delimiter,$string,$limit)tham số giới hạn của. Ví dụ: explode('.','1.2.3.4',3) === array('1','2','3.4')- trong khi ở Javascript, bạn sẽ nhận được : '1.2.3.4'.split('.',3) === ['1', '2', '3']. Bất cứ ai cũng biết cách dễ dàng sao chép phương thức của PHP?
Nathan JB

1
Tôi đã thêm một nhận xét mã để xóa mảng [0], có thể gây nhầm lẫn cho người mới ...
NDM

46

Bạn không cần phải chia. Bạn có thể sử dụng indexOfsubstr:

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

Nhưng tương đương với explodesẽ là split.


5
Ai đó có thể nghĩ rằng bạn đang bị ngớ ngẩn. Đôi khi bạn phải giải thích mọi thứ. Ví dụ: "Vấn đề của bạn được giải quyết tốt nhất bằng 'indexOf' ... nhưng 'split' trả lời câu hỏi của bạn theo nghĩa đen."
Joel Mellon

Downvoter: "Làm thế nào bạn dám cung cấp một giải pháp đơn giản và hiệu quả hơn thay vì xác nhận các định kiến ​​của tôi ??"
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;
};

Nên bắt chước chính xác hàm explode () của PHP.

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

7
Kudos cho là CHỈ một, như xa như tôi có thể thấy, để cung cấp một THỰC TẾ tương đương với chức năng phát nổ của PHP (theo câu hỏi ban đầu).
faazshift

1
Thật là một giải pháp đơn giản và thanh lịch, tôi ước rằng đây là phản hồi được chấp nhận.
soger



6

tạo một đối tượng:

// 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
Có vẻ hơi quá mức, ty cho phản hồi tho
Doug Molineux


4

Nếu bạn thích php, hãy xem php.JS - JavaScript bùng nổ

Hoặc trong chức năng JavaScript bình thường: `

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

Tôi muốn nhìn cô ấy, nhưng chỉ thấy JavaScript lộn xộn trước mặt tôi. Uhm, emptyArray = { 0: '' }? : - /
Marcel Korpel

Tôi chưa nói rằng đó là giải pháp tốt nhất, nhưng nó là một giải pháp tốt nếu bạn chưa quen với JavScript và quen thuộc với php. Nhưng có một lý do tại sao tôi viết một ví dụ khác. :) "Giữ cho nó đơn giản ngu ngốc!";)
eriksv88

Điều đó nghe có vẻ hợp lý, nhưng tôi nghĩ người ta không muốn chuyển đổi một ngôn ngữ lập trình sang ngôn ngữ khác; điều đó có thể gây hiểu lầm cho những người mới, những người có thể nghĩ rằng OOP trong JavaScript giống như OOP trong C ++. Hơn nữa, ai đó có thể chỉ cần sao chép chức năng được liên kết và nghĩ rằng người ta phải xác định mảng theo cách đó.
Marcel Korpel

Vâng, hoàn toàn đồng ý ở đó! Nhưng nó không thực sự nhận được mã trong tay anh ta. và đó là nó. Nếu anh ta biết php, vì vậy có lẽ anh ta bỏ lỡ những điều nhỏ nhặt trong php. Đó là logic tốt nhất tôi đang đề cập đến logic, không phải là một giải pháp phấn màu sao chép, không bao giờ có một giải pháp tốt! Kinh nghiệm của tôi là ngày nhận ra rằng nó có rất nhiều điều để học, đó là khi bạn đang đi đúng hướng.
eriksv88

+1 Theo như tôi có thể thấy đây là giải pháp duy nhất có chức năng giống như PHP. Nếu không tìm thấy dấu phân cách thì kết quả là chuỗi gốc explode('foo','bar'); // 'bar'Đây là lý do tôi đến đây và với mục đích của tôi, một bản sao và dán tập lệnh mà tôi dự định sử dụng với giới hạn là hoàn toàn hoàn hảo. Tôi không cần phải tự mình tạo ra. Tại sao lại phát minh lại bánh xe, hôn
Andy Gee

4

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

đầu ra: TEMP:data

  • .split () sẽ phân tách một chuỗi thành các phần
  • .join () tập hợp lại mảng trở lại chuỗi
  • khi bạn muốn mảng không có mục đầu tiên, hãy sử dụng .slice (1)

Câu trả lời này nên có 554 lượt upvote, không phải câu trả lời được chấp nhận. Ngoài ra, trong 3 năm qua, câu trả lời được chấp nhận là hoàn toàn sai , nối các chỉ số 0 và 1 khi OP yêu cầu 1 và 2.
NobleUplift

2

Không có ý định phê bình John Hartsock , chỉ trong trường hợp số lượng dấu phân cách có thể thay đổi đối với bất kỳ ai sử dụng mã đã cho, tôi sẽ chính thức đề nghị sử dụng mã này thay thế ...

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"

Câu trả lời rất dí dỏm. Tôi tự hỏi làm thế nào nó thực hiện tốt so với một phân chia truyền thống.
NobleUplift

1

Chỉ cần thêm một chút vào câu trả lời tâm lý (phiên bản của anh ta không hoạt động trong IE <= 8). Mã này tương thích với nhiều trình duyệt:

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

Vì vậy, tôi biết rằng bài đăng này khá cũ, nhưng tôi đoán rằng tôi cũng có thể thêm một chức năng đã giúp tôi trong nhiều năm qua. Tại sao không làm lại chức năng explode bằng cách sử dụng split như đã đề cập ở trên? Vâng, đây là:

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

Hàm này hoạt động tốt nếu bạn đang cố lấy các giá trị giữa hai giá trị. Ví dụ:

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

Nếu bạn quan tâm đến việc lấy thông tin từ giữa hai "giá trị" "thẻ", bạn có thể sử dụng chức năng như sau.

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

Nhưng hãy nói rằng bạn không có những "thẻ" tiện dụng như ví dụ trên được hiển thị. Không vấn đề.

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

Wana thấy nó trong hành động? Nhấn vào đây .


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

biến phát nổ sẽ trả về mảng và bạn có thể truy cập các phần tử của mảng đang truy cập vào nó đã phát nổ đúng [nth] trong đó nth là chỉ số của giá trị bạn muốn nhận


2
Điều này thậm chí không hoạt động! splice chấp nhận 2 chữ số và chuỗi làm tham số, không phải là một ~(điều này gây ra lỗi cú pháp). Và mối nối không dành cho mục đích này, nó là để lấy / lấy các mục từ hoặc thêm vào một mảng.
CPHPython

0

thử như thế này

ans = str.split (":");

Và bạn có thể sử dụng hai phần của chuỗi như,

ans [0] và ans [1]


2
Có lẽ giải thích điều này khác với câu trả lời được chấp nhận được đăng 8 năm trước.
Lece

0

Tôi đã sử dụng lát, tách và tham gia Bạn chỉ có thể viết một dòng mã

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

0

Nếu bạn muốn xác định chức năng của riêng mình, hãy thử điều này:

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
}

Lấy từ: http://locutus.io/php/strings/explode/


-1

Mã của Felix Kling là động (không giống như câu trả lời được chấp nhận) tuy nhiên chuỗi ví dụ ban đầu là điểm khởi đầu khủng khiếp. Vì vậy, để thể hiện trực quan câu trả lời của anh ấy (anh ấy chỉ trả lời câu hỏi) cho những người muốn chất lượng tốc độ:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.