Javascript Эквивалент PHP Разнесение ()


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]
герр

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)Параметр limit НЕ работает так же, как explode($delimiter,$string,$limit)параметр limit. Пример: explode('.','1.2.3.4',3) === array('1','2','3.4')- в то время как в Javascript, вы получите: '1.2.3.4'.split('.',3) === ['1', '2', '3']. Кто-нибудь знает, как легко повторить метод PHP?
Натан Джей Би

1
Я добавил комментарии к коду, чтобы прояснить материал массива [0], это может сбить с толку новичков ...
NDM

46

Вам не нужно разделять. Вы можете использовать indexOfи substr:

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

Но эквивалент explodeбудет split.


5
Кто-то, вероятно, подумал, что ты был сумасшедшим Иногда вы должны все объяснить. Например, «ваша проблема лучше всего решается с помощью indexOf ... но« split »отвечает на ваш вопрос буквально».
Джоэл Меллон

Даунвотер: «Как ты смеешь предлагать более простое и более производительное решение вместо проверки моих предубеждений?»
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 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
Кажется, немного излишним, ответ на этот вопрос
Даг Молинью


4

Если вам нравится php, взгляните на php.JS - JavaScript взорвется

Или в нормальной функциональности JavaScript: `

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

Я хотел посмотреть на нее, но передо мной был только грязный JavaScript. Хм emptyArray = { 0: '' }? : - /
Марсель Корпель

Я не говорил, что это лучшее решение, но это хорошее решение, если вы новичок в JavScript и знакомы с php. Но была причина, почему я написал другой пример. :) «Держите это просто глупо!»;)
eriksv88

Это звучит разумно, но я думаю, что не следует преобразовывать один язык программирования в другой; это может ввести в заблуждение новичков, которые могут подумать, что ООП в JavaScript подобен ООП в 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

Просто небольшое дополнение к ответу 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(~);

переменная в разобранном виде вернет массив, и вы можете получить доступ к элементам массива, обратившись к нему true. exploded [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.