Javascript เทียบเท่ากับ PHP Explode ()


353

ฉันมีสายนี้:

0000000020C90037: TEMP: ข้อมูล

ฉันต้องการสตริงนี้:

TEMP: ข้อมูล

ด้วย PHP ฉันจะทำสิ่งนี้:

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

ฉันจะexplodeใช้สตริงใน JavaScript อย่างมีประสิทธิภาพใน PHP ได้อย่างไร?

คำตอบ:


607

นี่คือการแปลงโดยตรงจากรหัส 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
ควรสังเกตว่าอาร์เรย์เริ่มต้นที่ [0]
Herr

52
@Herr Kaleun ... เข้าใจแล้ว ... แต่ OP ต้องการรายการสองรายการสุดท้ายในอาร์เรย์
John Hartsock

4
+1: ถูกต้อง; นี่คือการเชื่อมโยงจาก MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/... และทิศทาง "ตรงกันข้าม" ดังนั้น PHP implode () ที่เทียบเท่าคือ myArray.join (':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/ …
Sk8erPeter

12
หมายเหตุ : split(delimiter,limit)พารามิเตอร์ จำกัด ของไม่ทำงานเหมือนกับexplode($delimiter,$string,$limit)พารามิเตอร์ จำกัด ของ ตัวอย่าง: explode('.','1.2.3.4',3) === array('1','2','3.4')- ใน Javascript คุณจะได้รับ: '1.2.3.4'.split('.',3) === ['1', '2', '3']. ใครรู้วิธีการทำซ้ำวิธีของ PHP ได้อย่างง่ายดาย?
นาธาน JB

1
ฉันได้เพิ่มความคิดเห็นรหัสเพื่อล้างอาร์เรย์ [0] สิ่งอาจสับสนมือใหม่ ...
NDM

46

คุณไม่จำเป็นต้องแยก คุณสามารถใช้indexOfและsubstr:

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

แต่จะเทียบเท่าจะเป็นexplodesplit


5
บางคนอาจคิดว่าคุณกำลังพูดว่าน่ารำคาญ บางครั้งคุณต้องอธิบายทุกอย่าง เช่น "ปัญหาของคุณได้รับการแก้ไขที่ดีที่สุดโดย 'indexOf' ... แต่ 'แยก' ตอบคำถามของคุณอย่างแท้จริง"
Joel Mellon

Downvoter: " คุณกล้าให้วิธีการแก้ปัญหาที่ง่ายและมีประสิทธิภาพมากกว่าการตรวจสอบอคติของฉันได้อย่างไร"
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;
};

ควรเลียนแบบฟังก์ชั่น explode () ของ PHP อย่างแน่นอน

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

7
ความรุ่งโรจน์สำหรับการเป็นเพียงคนเดียวเท่าที่ฉันเห็นเพื่อให้เทียบเท่าจริงกับฟังก์ชั่นการระเบิดของ PHP (ตามคำถามเดิม)
faazshift

1
ช่างเป็นทางออกที่เรียบง่ายและสง่างามฉันหวังว่านี่คือคำตอบที่ยอมรับ
soger



6

สร้างเป็นวัตถุ:

// 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
ดูเหมือน overkill นิดหน่อยสำหรับการตอบสนองสรรพ
Doug Molineux


4

ถ้าคุณชอบ php ลองดูphp.JS - JavaScript explode

หรือในการทำงานของจาวาสคริปต์ปกติ: `

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

ฉันอยากจะดูเธอ แต่มีจาวาสคริปต์ที่ยุ่งเหยิงต่อหน้าฉันเท่านั้น Uhm, emptyArray = { 0: '' }? : - /
Marcel Korpel

ฉันไม่ได้บอกว่ามันเป็นทางออกที่ดีที่สุด แต่ก็เป็นทางออกที่ดีถ้าคุณยังใหม่กับ JavScript และคุ้นเคยกับ php แต่มีเหตุผลว่าทำไมฉันจึงเขียนอีกตัวอย่างหนึ่ง :) "ทำให้มันโง่ง่าย ๆ !";)
eriksv88

ฟังดูสมเหตุสมผล แต่ฉันคิดว่าไม่ควรเปลี่ยนภาษาการเขียนโปรแกรมหนึ่งเป็นอีกภาษาหนึ่ง ที่อาจทำให้เข้าใจผิดกับมือใหม่ที่อาจคิดว่า OOP ใน JavaScript เหมือน OOP ใน C ++ ยิ่งกว่านั้นบางคนอาจคัดลอกฟังก์ชันที่เชื่อมโยงไว้และคิดว่าต้องกำหนดอาร์เรย์ด้วยวิธีนั้น
Marcel Korpel

ใช่เห็นด้วยอย่างสมบูรณ์! แต่มันไม่ได้รับรหัสในมือของเขา และนั่นคือมัน ถ้าเขารู้ php ดังนั้นบางทีเขาอาจพลาดสิ่งเล็กน้อยใน php เป็นตรรกะที่ดีที่สุดที่ฉันอ้างถึงตรรกะไม่ใช่วิธีการคัดลอกพาสไม่เคยมีทางออกที่ดีเลย! ประสบการณ์ของฉันคือวันที่ตระหนักว่ามีอะไรมากมายให้เรียนรู้นั่นคือเมื่อคุณอยู่ในเส้นทางที่ถูกต้อง
eriksv88

+1 เท่าที่ฉันเห็นนี่เป็นทางออกเดียวที่ทำงานเหมือนกับ PHP หากไม่พบตัวคั่นผลลัพธ์เป็นสตริงดั้งเดิมexplode('foo','bar'); // 'bar'นี่คือเหตุผลที่ฉันมาที่นี่และเพื่อวัตถุประสงค์ของฉันสคริปต์คัดลอกและวางซึ่งฉันตั้งใจจะใช้กับข้อ จำกัด นั้นสมบูรณ์แบบที่สุด ฉันไม่ต้องกีดกันการสร้างของตัวเอง ทำไมต้องคิดค้นล้อใหม่หลังจากจูบทั้งหมด
Andy Gee

4

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

เอาท์พุท: TEMP:data

  • .split () จะแยกสตริงออกเป็นส่วนต่างๆ
  • .join () ประกอบอาร์เรย์กลับเป็นสตริงอีกครั้ง
  • เมื่อคุณต้องการอาร์เรย์ที่ไม่มีรายการแรกให้ใช้ .slice (1)

คำตอบนี้ควรมี upvotes 554 ไม่ใช่คำตอบที่ยอมรับ นอกจากนี้ในช่วง 3 ปีที่ผ่านมาคำตอบที่ยอมรับนั้นผิดดัชนีเชื่อมโยง 0 และ 1 เมื่อ OP ขอ 1 และ 2
NobleUplift

2

โดยไม่ตั้งใจที่จะวิจารณ์John Hartsockเพียงแค่ในกรณีที่จำนวนตัวคั่นอาจแตกต่างกันสำหรับทุกคนที่ใช้รหัสที่กำหนดฉันขอแนะนำอย่างเป็นทางการให้ใช้สิ่งนี้แทน ...

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"

คำตอบที่เฉียบแหลมมาก ฉันสงสัยว่ามันทำงานได้ดีเมื่อเปรียบเทียบกับการแบ่งแบบดั้งเดิม
NobleUplift

1

เพียงเล็กน้อยนอกเหนือจากคำตอบของpsycho brm (เวอร์ชันของเขาใช้งานไม่ได้ใน IE <= 8) รหัสนี้เข้ากันได้กับเบราว์เซอร์ข้าม:

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

ดังนั้นฉันรู้ว่าโพสต์นี้ค่อนข้างเก่า แต่ฉันคิดว่าฉันอาจเพิ่มฟังก์ชั่นที่ช่วยฉันได้หลายปี ทำไมไม่เพียงแค่สร้างใหม่ฟังก์ชั่นการระเบิดโดยใช้ split ตามที่กล่าวไว้ข้างต้น? นี่มันคือ:

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

ฟังก์ชันนี้ใช้งานได้ดีหากคุณพยายามรับค่าระหว่างสองค่า ตัวอย่างเช่น

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

หากคุณสนใจรับข้อมูลจากทั้งสอง [แท็ก] "แท็ก" คุณสามารถใช้ฟังก์ชันดังต่อไปนี้

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

แต่สมมติว่าคุณไม่มี "แท็ก" ที่มีประโยชน์ดังตัวอย่างที่แสดงด้านบน ไม่เป็นไร

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

วนาเห็นมันในการกระทำ? คลิกที่นี่


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

ตัวแปรที่ขยายจะส่งคืนอาเรย์และคุณสามารถเข้าถึงองค์ประกอบของอาเรย์เพื่อเข้าถึงมันเป็นจริงระเบิด [nth] โดยที่ nth คือดัชนีของค่าที่คุณต้องการรับ


2
มันใช้งานไม่ได้! splice ยอมรับ 2 ดิจิตและสตริงเป็นพารามิเตอร์ไม่ใช่ a ~(ทำให้เกิดข้อผิดพลาดทางไวยากรณ์) และการประกบกันไม่ได้มีไว้เพื่อจุดประสงค์นี้มันคือการรับ / นำรายการออกจากหรือเพิ่มในอาร์เรย์
CPHPython

0

ลองแบบนี้

ans = str.split (":");

และคุณสามารถใช้สตริงสองส่วนเช่น

ans [0] และ ans [1]


2
อาจอธิบายว่าสิ่งนี้แตกต่างจากคำตอบที่ตอบรับเมื่อ 8 ปีที่แล้วหรือไม่
Lece

0

ฉันใช้ส่วนแบ่งและเข้าร่วมคุณสามารถเขียนโค้ดหนึ่งบรรทัด

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

0

หากคุณต้องการกำหนดฟังก์ชั่นของคุณเองลองสิ่งนี้:

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
}

นำมาจาก: http://locutus.io/php/strings/explode/


-1

โค้ดของ Felix Kling เป็นแบบไดนามิก (ต่างจากคำตอบที่ยอมรับ) อย่างไรก็ตามสตริงตัวอย่างเริ่มต้นนั้นเป็นจุดเริ่มต้นที่แย่มาก ดังนั้นเพื่อให้สายตาแสดงให้เห็นถึงคำตอบของเขา (เขาเป็นเพียงแค่การตอบคำถาม) สำหรับผู้ที่ต้องการที่มีคุณภาพและความเร็ว:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.