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?

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'

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.


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']

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



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

7
Semble un peu exagéré, ty pour la réponse tho
Doug Molineux


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]; `

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)

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

1
var str = '0000000020C90037:TEMP:data';    // str = "0000000020C90037:TEMP:data"
str = str.replace(/^[^:]+:/, "");          // str = "TEMP:data"

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

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 .


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


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]


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(":");

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/


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.