Javascript, еквівалентний PHP Explode ()


353

У мене є цей рядок:

0000000020C90037: 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]
Герр

52
@Herr Kaleun ... Це зрозуміло ... Але ОП хотів останні два елементи в масиві.
Джон Харцок

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)граничний параметр 's. Приклад: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);

Але еквівалент був explodeби split.


5
Хтось, напевно, подумав, що ти хитрий. Іноді доводиться все пояснювати. Наприклад, "Вашу проблему найкраще вирішити" indexOf "... але" розділити "відповідає на ваше запитання буквально".
Джоел Меллон

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

Чи повинен точно імітувати PHP-функцію explode ().

'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 is the object:

// 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
Здається, трохи зайвого, ти для відповіді через
Doug Molineux


4

Якщо вам подобається php, подивіться на php.JS - JavaScript explode

Або в звичайному функціоналі JavaScript: `

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

Я хотів подивитися на неї, але тільки переплутав JavaScript перед собою. Ум emptyArray = { 0: '' },? : - /
Марсель Корпель

Я не говорив, що це найкраще рішення, але це хороше рішення, якщо ви новачок у JavScript і знаєте php. Але була причина, чому я написав ще один приклад. :) "Тримай просто дурне!";)
eriksv88

Це звучить розумно, але я вважаю, що не варто перетворювати одну мову програмування в іншу; це може ввести в оману для новачків, які можуть подумати, що OOP в JavaScript схожий на OOP в C ++. Більше того, хтось може просто скопіювати вставлену функцію і подумати, що таким чином треба визначити масиви.
Марсель Корпель

Так, повністю згоден там! Але це насправді не отримання коду в його руки. і це все. Якщо він знає php, то, можливо, він пропускає дрібниці у php. Це найкраща логіка. Я маю на увазі логіку, а не як рішення пастельних копій, ніколи не буде хорошого рішення! Мій досвід полягає в тому, що в день усвідомлення того, що йому є чому навчитися, саме тоді ви на правильному шляху.
eriksv88

+1 Наскільки я бачу, це єдине рішення, яке функціонує так само, як PHP. Якщо роздільник не знайдений, результат є оригінальним рядком. explode('foo','bar'); // 'bar'Тому я приїхав сюди, і для моїх цілей копія та вставка сценарію, який я маю намір використовувати з обмеженнями, абсолютно ідеальна. Мені не доводиться переходити на бік створення власного. Навіщо все-таки винаходити колесо, цілуйся
Енді Гі

4

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

Виходи: TEMP:data

  • .split () буде розбирати рядок на частини
  • .join () знову збирає масив назад до рядка
  • коли ви хочете масив без його першого елемента, використовуйте .slice (1)

Ця відповідь повинна мати 554 відгуків, а не прийняту відповідь. Крім того, за останні 3 роки прийнята відповідь була абсолютно помилковою , об'єднуючи індекси 0 і 1, коли ОП просили 1 і 2.
NobleUplift

2

Без жодних намірів критикувати Джона Харцока , на випадок, якщо кількість роздільників може змінюватись для тих, хто використовує даний код, я б офіційно запропонував використовувати це замість ...

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

Лише невелике доповнення до відповіді психо-психометра (його версія не працює в 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

Тож я знаю, що ця публікація досить стара, але я подумав, що я можу також додати функцію, яка допомагала мені протягом багатьох років. Чому б не просто переробити функцію вибуху, використовуючи спліт, як згадувалося вище? Ну ось це:

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 років тому.
Лес

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

Код Фелікса Клінга динамічний (на відміну від прийнятої відповіді), проте початковий рядок прикладу - жахлива відправна точка. Тож візуально продемонструйте свою відповідь (він просто відповідає на запитання) для тих, хто хоче якості та швидкості:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.