Javascript equivalente a PHP Explode ()

353

Tengo esta cadena:

0000000020C90037: TEMP: datos

Necesito esta cadena:

TEMP: datos.

Con PHP haría esto:

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

¿Cómo hago para que explodeuna cadena en JavaScript funcione de manera efectiva en PHP?

Doug Molineux
fuente

Respuestas:

607

Esta es una conversión directa de su código 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
fuente
75
Cabe señalar que la matriz comienza en [0]
Herr
52
@Herr Kaleun ... Eso se entiende ... Pero OP quería los dos últimos elementos de la matriz.
John Hartsock
44
+1: eso es correcto; Aquí hay un enlace de MDN: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . Y la dirección "opuesta", por lo que el equivalente de PHP implode () es myArray.join (':'): developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Sk8erPeter
12
NOTA : split(delimiter,limit)El parámetro límite de 'NO funciona igual que explode($delimiter,$string,$limit)el parámetro límite de'. Ejemplo: explode('.','1.2.3.4',3) === array('1','2','3.4')- mientras que en Javascript, que obtendrá: '1.2.3.4'.split('.',3) === ['1', '2', '3']. ¿Alguien sabe cómo replicar fácilmente el método de PHP?
Nathan JB
1
He agregado un código de comentarios para aclarar las cosas de la matriz [0], podría confundir a los novatos ...
NDM
46

No necesitas separarte. Puedes usar indexOfy substr:

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

Pero el equivalente a explodesería split.

Felix Kling
fuente
55
Probablemente alguien pensó que estabas siendo sarcástico. A veces tienes que explicar todo. Por ejemplo, "Su problema se resuelve mejor con 'indexOf' ... pero 'split' responde su pregunta literalmente".
Joel Mellon
Downvoter: "¿Cómo te atreves a proporcionar una solución más simple y eficaz en lugar de validar mis ideas preconcebidas?"
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;
};

Debe imitar exactamente la función explde () de PHP.

'a'.explode('.', 2); // ['a']
'a.b'.explode('.', 2); // ['a', 'b']
'a.b.c'.explode('.', 2); // ['a', 'b.c']
psycho brm
fuente
77
Felicitaciones por ser el ÚNICO , por lo que puedo ver, para proporcionar un equivalente REAL a la funcionalidad de explosión de PHP (según la pregunta original).
faazshift
1
Qué solución tan simple y elegante, desearía que esta fuera la respuesta aceptada.
soger
9

Prueba esto:

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

crear es un objeto:

// 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
fuente
77
Parece un poco exagerado, ty por la respuesta aunque
Doug Molineux
4

Use String.split

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

Ron alemán
fuente
4

Si le gusta php, eche un vistazo a php.JS: JavaScript explota

O en la funcionalidad normal de JavaScript: `

var vInputString = "0000000020C90037:TEMP:data";
var vArray = vInputString.split(":");
var vRes = vArray[1] + ":" + vArray[2]; `
eriksv88
fuente
Quería mirarla, pero solo tenía JavaScript desordenado frente a mí. Uhm, emptyArray = { 0: '' }? : - /
Marcel Korpel
No he dicho que sea la mejor solución, pero es una buena solución si eres nuevo en JavScript y estás familiarizado con php. Pero había una razón por la que escribí otro ejemplo. :) "¡
Hazlo
Eso suena razonable, pero creo que uno no debería querer transformar un lenguaje de programación en otro; eso podría ser engañoso para los novatos que podrían pensar que OOP en JavaScript es como OOP en C ++. Además, alguien podría simplemente copiar y pegar la función vinculada y pensar que hay que definir las matrices de esa manera.
Marcel Korpel
Sí, completamente de acuerdo allí! Pero en realidad no es tener el código en su mano. y eso es. Si conoce php, entonces tal vez se pierda pequeñas cosas en php. Es la mejor lógica Me refiero a la lógica, no como una solución de copiar pasteles, ¡nunca hay una buena solución! Mi experiencia es que el día se da cuenta de que tiene mucho que aprender, es cuando estás en el camino correcto.
eriksv88
+1 Hasta donde puedo ver, esta es la única solución que funciona igual que PHP. Si no se encuentra el delimitador, el resultado es la cadena original. explode('foo','bar'); // 'bar'Esta es la razón por la que llegué aquí y, para mis propósitos, un script de copiar y pegar que pretendo usar con límites es absolutamente perfecto. No tengo que dejar de lado para crear el mío. ¿Por qué reinventar la rueda después de todo, beso
Andy Gee
4

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

salidas: TEMP:data

  • .split () desmontará una cadena en partes
  • .join () vuelve a ensamblar la matriz en una cadena
  • cuando desee la matriz sin su primer elemento, use .slice (1)
exebook
fuente
Esta respuesta debe tener 554 votos a favor, no la respuesta aceptada. Además, durante los últimos 3 años, la respuesta aceptada ha sido completamente incorrecta , concatenando los índices 0 y 1 cuando el OP solicitó 1 y 2.
NobleUplift
2

Sin intenciones de criticar a John Hartsock , en caso de que el número de delimitadores pueda variar para cualquiera que use el código dado, sugeriría formalmente usar esto en su lugar ...

var mystr = '0000000020C90037:TEMP:data';
var myarr = mystr.split(":");
var arrlen = myarr.length;
var myvar = myarr[arrlen-2] + ":" + myarr[arrlen-1];
dylan maxey
fuente
1
var str = '0000000020C90037:TEMP:data';    // str = "0000000020C90037:TEMP:data"
str = str.replace(/^[^:]+:/, "");          // str = "TEMP:data"
Ruben Kazumov
fuente
Muy ingeniosa respuesta. Me pregunto qué tan bien funciona en comparación con una división tradicional.
NobleUplift
1

Solo una pequeña adición a la respuesta de psycho brm (su versión no funciona en IE <= 8). Este código es compatible con varios navegadores:

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
fuente
0

Así que sé que esta publicación es bastante antigua, pero pensé que también podría agregar una función que me haya ayudado a lo largo de los años. ¿Por qué no simplemente rehacer la función de explosión usando la división como se mencionó anteriormente? Pues aquí está:

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

Esta función funciona bien si está intentando obtener los valores entre dos valores. Por ejemplo:

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

Si estaba interesado en obtener la información entre las dos "etiquetas" [valores], podría utilizar la función de la siguiente manera.

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

Pero supongamos que no tiene esas prácticas "etiquetas" como se muestra en el ejemplo anterior. No importa.

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

¿Lo ves en acción? Haga clic aquí .

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

la variable explotada devolverá la matriz y puede acceder a elementos de la matriz accediendo a ella verdadera explotada [nth] donde nth es el índice del valor que desea obtener

Abdullahi Mako Ayuba
fuente
2
¡Esto ni siquiera funciona! el empalme acepta 2 dígitos y cadenas como parámetros, no a ~(esto provoca un error de sintaxis). Y el empalme no es para este propósito, es para obtener / sacar elementos de una matriz o agregarlos.
CPHPython
0

intenta así,

ans = str.split (":");

Y puedes usar dos partes de la cadena como,

ans [0] y ans [1]

meignanamoorthy ks
fuente
2
Quizás explique cómo esto difiere de la respuesta aceptada publicada hace 8 años.
Lece
0

Usé cortar, dividir y unir Puedes escribir una sola línea de código

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

Si desea definir su propia función, intente esto:

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
}

Tomado de: http://locutus.io/php/strings/explode/

harish sharma
fuente
-1

El código de Felix Kling es dinámico (a diferencia de la respuesta aceptada), sin embargo, la cadena de ejemplo inicial es un punto de partida terrible. Entonces, para demostrar visualmente su respuesta (solo está respondiendo la pregunta) para aquellos que quieren calidad y velocidad:

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

Juan
fuente