Javascript équivalent à PHP Explode ()

353

J'ai cette chaîne:

0000000020C90037: TEMP: données

J'ai besoin de cette chaîne:

TEMP: données.

Avec PHP, je ferais ceci:

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

Comment puis-je efficacement explodeune chaîne en JavaScript la façon dont il fonctionne en PHP?

Doug Molineux
la source

Réponses:

607

Il s'agit d'une conversion directe à partir de votre code 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'
John Hartsock
la source
75
il convient de noter que le tableau commence à [0]
Herr
52
@Herr Kaleun ... C'est entendu ... Mais OP voulait les deux derniers éléments du tableau.
John Hartsock,
4
+1: C'est exact; voici un lien de MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . Et la direction "opposée", donc l'équivalent PHP implode () est myArray.join (':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Sk8erPeter
12
REMARQUE : split(delimiter,limit)le paramètre de limite de ne fonctionne PAS de la même manière que explode($delimiter,$string,$limit)le paramètre de limite de. Exemple: explode('.','1.2.3.4',3) === array('1','2','3.4')- tout en Javascript, vous obtenez: '1.2.3.4'.split('.',3) === ['1', '2', '3']. Quelqu'un sait comment répliquer facilement la méthode PHP?
Nathan JB
1
J'ai ajouté un commentaire de code pour effacer les éléments du tableau [0], pourrait être source de confusion pour les débutants ...
NDM
46

Vous n'avez pas besoin de vous séparer. Vous pouvez utiliser indexOfet substr:

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

Mais l'équivalent de explodeserait split.

Felix Kling
la source
5
Quelqu'un a probablement pensé que vous étiez sournois. Parfois, il faut tout expliquer. Par exemple, "Votre problème est mieux résolu par 'indexOf' ... mais 'split' répond littéralement à votre question."
Joel Mellon
Downvoter: "Comment osez- vous fournir une solution plus simple et plus performante au lieu de valider mes idées préconçues ??"
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;
};

Devrait imiter exactement la fonction explode () de PHP.

'a'.explode('.', 2); // ['a']
'a.b'.explode('.', 2); // ['a', 'b']
'a.b.c'.explode('.', 2); // ['a', 'b.c']
psycho brm
la source
7
Félicitations pour être le SEUL , pour autant que je puisse voir, à fournir un équivalent réel à la fonctionnalité d'explosion de PHP (selon la question d'origine).
faazshift
1
Quelle solution simple et élégante, je souhaite que ce soit la réponse acceptée.
soger
28

On dirait que tu veux diviser

Quentin
la source
9

Essaye ça:

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

créer un objet:

// 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";
JM Design
la source
7
Semble un peu exagéré, ty pour la réponse tho
Doug Molineux
4

Utilisez String.split

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

Rumm allemand
la source
4

Si vous aimez php, jetez un œil à php.JS - JavaScript explose

Ou dans la fonctionnalité JavaScript normale: `

var vInputString = "0000000020C90037:TEMP:data";
var vArray = vInputString.split(":");
var vRes = vArray[1] + ":" + vArray[2]; `
eriksv88
la source
Je voulais la regarder, mais je n'ai eu que du JavaScript désordonné devant moi. Uhm, emptyArray = { 0: '' }? : - /
Marcel Korpel
Je n'ai pas dit que c'est la meilleure solution, mais c'est une bonne solution si vous êtes nouveau sur JavScript et que vous connaissez php. Mais il y avait une raison pour laquelle j'ai écrit un autre exemple. :) "Keep it simple stupid!";)
eriksv88
Cela semble raisonnable, mais je pense que l'on ne devrait pas vouloir transformer un langage de programmation en un autre; cela pourrait être trompeur pour les débutants qui pourraient penser que la POO en JavaScript est comme la POO en C ++. De plus, quelqu'un pourrait simplement copier-coller la fonction liée et penser qu'il faut définir les tableaux de cette façon.
Marcel Korpel
Oui, complètement d'accord là-bas! Mais ce n'est pas vraiment mettre le code entre ses mains. et c'est tout. S'il connaît php, alors peut-être qu'il manque de petites choses en php. C'est la meilleure logique que je fais référence à la logique, pas comme une solution de copie de pastels, il n'y a jamais de bonne solution! Mon expérience est que le jour de se rend compte qu'il a beaucoup à apprendre, c'est alors que vous êtes sur la bonne voie.
eriksv88
+1 Pour autant que je puisse voir, c'est la seule solution qui fonctionne de la même manière que PHP. Si le délimiteur n'est pas trouvé, le résultat est la chaîne d'origine. explode('foo','bar'); // 'bar'C'est la raison pour laquelle je suis arrivé ici et pour mes besoins, un script copier-coller que j'ai l'intention d'utiliser avec des limites est absolument parfait. Je n'ai pas besoin d'être mis à l'écart pour créer le mien. Pourquoi réinventer la roue après tout, baiser
Andy Gee
4

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

les sorties: TEMP:data

  • .split () démontera une chaîne en plusieurs parties
  • .join () réassemble le tableau en une chaîne
  • lorsque vous voulez le tableau sans son premier élément, utilisez .slice (1)
exebook
la source
Cette réponse devrait contenir 554 votes positifs, et non la réponse acceptée. En outre, au cours des 3 dernières années, la réponse acceptée a été complètement fausse , concaténant les indices 0 et 1 lorsque le PO a demandé 1 et 2.
NobleUplift
2

Sans intention de critiquer John Hartsock , juste au cas où le nombre de délimiteurs pourrait varier pour toute personne utilisant le code donné, je suggère formellement de l'utiliser à la place ...

var mystr = '0000000020C90037:TEMP:data';
var myarr = mystr.split(":");
var arrlen = myarr.length;
var myvar = myarr[arrlen-2] + ":" + myarr[arrlen-1];
dylan maxey
la source
1
var str = '0000000020C90037:TEMP:data';    // str = "0000000020C90037:TEMP:data"
str = str.replace(/^[^:]+:/, "");          // str = "TEMP:data"
Ruben Kazumov
la source
Réponse très pleine d'esprit. Je me demande à quel point il fonctionne bien par rapport à un split traditionnel.
NobleUplift
1

Juste un petit ajout à la réponse de psycho brm (sa version ne fonctionne pas dans IE <= 8). Ce code est compatible avec tous les navigateurs:

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
la source
0

Je sais donc que ce message est assez ancien, mais je me suis dit que je pourrais aussi bien ajouter une fonction qui m'a aidé au fil des ans. Pourquoi ne pas simplement refaire la fonction d'explosion en utilisant le fractionnement comme mentionné ci-dessus? Et bien voilà:

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

Cette fonction fonctionne bien si vous essayez d'obtenir des valeurs entre deux valeurs. Par exemple:

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

Si vous vouliez obtenir les informations entre les deux "balises" de [valeurs], vous pouvez utiliser la fonction comme suit.

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

Mais disons que vous n'avez pas ces "balises" pratiques comme l'exemple ci-dessus. Peu importe.

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

Vous voulez le voir en action? Cliquez ici .

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

la variable éclatée renverra un tableau et vous pouvez accéder aux éléments du tableau en y accédant true exploded [nth] où nth est l'indice de la valeur que vous souhaitez obtenir

Abdullahi Mako Ayuba
la source
2
Cela ne marche même pas! splice accepte 2 chiffres et chaînes comme paramètres, pas un ~(cela provoque une erreur de syntaxe). Et l' épissure n'est pas à cette fin, c'est pour obtenir / retirer des éléments ou les ajouter à un tableau.
CPHPython
0

essayez comme ça,

ans = str.split (":");

Et vous pouvez utiliser deux parties de la chaîne comme,

ans [0] et ans [1]

meignanamoorthy ks
la source
2
Peut-être expliquer en quoi cela diffère de la réponse acceptée publiée il y a 8 ans.
Lece
0

J'ai utilisé slice, split and join Vous pouvez simplement écrire une ligne de code

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

Si vous souhaitez définir votre propre fonction, essayez ceci:

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
}

Tiré de: http://locutus.io/php/strings/explode/

harish sharma
la source
-1

Le code de Felix Kling est dynamique (contrairement à la réponse acceptée) mais la chaîne d'exemple initiale est un terrible point de départ. Donc, pour démontrer visuellement sa réponse (il répond juste à la question) pour ceux qui veulent de la qualité et de la vitesse:

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

John
la source