¿Cómo puedo explotar y recortar espacios en blanco?

167

Por ejemplo, me gustaría crear una matriz a partir de los elementos en esta cadena:

$str = 'red,     green,     blue ,orange';

Sé que puedes explotar y recorrerlos y recortarlos:

$arr = explode(',', $str);
foreach ($arr as $value) {
    $new_arr[] = trim($value);
}

Pero siento que hay un enfoque de una línea que puede manejar esto. ¿Algunas ideas?

SeanWM
fuente

Respuestas:

449

Puede hacer lo siguiente usando array_map :

$new_arr = array_map('trim', explode(',', $str));
SeanWM
fuente
10
Esto también está en bucle (internamente) por PHP
Jason OOO
2
esto ... salvó ... mi ... vida ... estaba tratando de manipular un archivo a través de fseek para agregarlo al final de un archivo ... una vez que decidí dividirlo en una matriz y reescribirlo En el archivo, vi que se agregaba espacio en blanco adicional todo el tiempo ... esto + implode me salvó la vida ... Ahora puedo ir a comer.
jenki221
44
@JasonOOO Creo que, en la opinión de la mayoría de la gente, un par de milisegundos (si es que eso es) es una compensación justa por tener una línea de código que es corta, simple y fácil de leer.
Gavin el
Simple y fácil de entender. Sin embargo, si se trata de grandes conjuntos de datos, la respuesta más eficaz proporcionada por @ amr-eladwy es la mejor solución.
Yaron
Me encanta este código y vuelvo a este sitio de vez en cuando.
patrickzzz
52

Una respuesta mejorada

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange');

Resultado:

Array
(
    [0] => red
    [1] => green thing
    [2] => blue
    [3] => orange
)

Esta

  • Se divide solo con comas
  • Recorta espacios en blanco de cada elemento.
  • Ignora los elementos vacíos.
  • No divide un elemento con espacios internos como "cosa verde"
Amr ElAdawy
fuente
77
¿Alguien puede explicarme por qué esta respuesta no tiene 100 votos a favor? Regexp es difícil de entender, pero analizó mi archivo de 100Mb más rápido que otras soluciones
Dan
2
Me alegra que lo hayas encontrado útil. Leí todas las respuestas y llegué con una mejor mezcla. La expresión regular se puede explicar en detalles.
Amr ElAdawy
2
Lo sentimos, pero esta expresión regular está mal, intente reemplazar redcon *red*. Una mejor podría ser / (\ s *, \ s *) + /
Greg
@AmrElAdawy FYI esto ya no funciona después de la actualización 8/28. Con la expresión regular en la respuesta tal cual, el espacio en blanco no se recorta de algunos de los elementos. Ej: 'cosa verde'.
Samsquanch
1
@Samsquanch actualizado. Avísame si ves algún problema.
Amr ElAdawy
25

Lo siguiente también se ocupa de los espacios en blanco al inicio / final de la cadena de entrada:

$new_arr = preg_split('/\s*,\s*/', trim($str));

y esta es una prueba mínima con espacios en blanco en cada posición sensible:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);
Diego Perini
fuente
Dado que las array_mapsoluciones regexp producen resultados idénticos, ¿alguien podría comparar su rendimiento?
Dan
@Dan Para casos como este, no habrá ninguna diferencia.
Aris
4

así como reemplazas y explotas en una sola línea de código

$str = 'red,     green,     blue ,orange';

$new_string = explode(',',preg_replace('/\s+/', '', $str));

dará salida a los resultados como

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => orange
)
Amit Sharma
fuente
3

Al combinar algunos de los principios en las respuestas existentes, se me ocurrió

preg_split ('/\s*,+\s*/', 'red,     green thing ,,  ,,   blue ,orange', NULL, PREG_SPLIT_NO_EMPTY);

El razonamiento detrás de esto es que encontré un error en esta respuesta , donde si hay una coma al final de la cadena, devolverá un elemento en blanco en la matriz. es decir

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange,');

Resultados en

Array
(
  [0] => red
  [1] => green thing
  [2] => blue
  [3] => orange
  [4] => ''
)

Puede solucionar esto utilizando PREG_SPLIT_NO_EMPTY como se menciona en esta respuesta para eliminarlo, pero una vez que lo hace, técnicamente no es necesario eliminar comas consecutivas a través de la expresión regular, por lo tanto, la expresión abreviada

shmurf
fuente
2

También puede hacer esto con una expresión regular de una línea

preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
Dom
fuente
1

prueba esto:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');
Jason OOO
fuente
El OP quiere una matriz. preg_replace()no genera una matriz a partir de una cadena. Esta es la respuesta correcta a la pregunta incorrecta. Voto negativo
mickmackusa
1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');la modificación menor rehabilita la respuesta
dreftymac
1

ESPECÍFICAMENTE para la cadena de muestra del OP, debido a que cada subcadena que debe coincidir es una sola palabra, puede usar str_word_count () .

Código: ( Demo )

$str = ' red,     green,     blue ,orange ';
var_export(str_word_count($str,1));  // 1 means return all words in an indexed array

Salida:

array (
  0 => 'red',
  1 => 'green',
  2 => 'blue',
  3 => 'orange',
)

Esto también se puede adaptar para subcadenas más allá de las letras (y algunos guiones y apóstrofes, si lee la letra pequeña) agregando los caracteres necesarios a la máscara de caracteres / tercer parámetro.

Código: ( Demo )

$str = " , Number1 ,     234,     0 ,4heaven's-sake  ,  ";
var_export(str_word_count($str,1,'0..9'));

Salida:

array (
  0 => 'Number1',
  1 => '234',
  2 => '0',
  3 => '4heaven\'s-sake',
)

Nuevamente, estoy tratando esta pregunta de manera muy limitada debido a la cadena de muestra, pero esto proporcionará el mismo resultado deseado:

Código: ( Demo )

$str = ' red,     green,     blue ,orange ';
var_export(preg_match_all('/[^, ]+/',$str,$out)?$out[0]:'fail');
mickmackusa
fuente
0

Puede usar preg_split () para eso.

$bar = preg_split ('/[,\s]+/', $str);
print_r ($bar);

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */
Sutandiono
fuente
Eso se dividirá en espacios en sus elementos
Chris KL
Mueva la coma a la izquierda de los corchetes para hacer la coma requerida.
Eric Leschinski
Mover la coma a la izquierda no resolverá eso. Verifique mi respuesta a continuación stackoverflow.com/a/38300330/5079380
Amr ElAdawy
-4
$str = str_replace(" ","", $str);
Blanco negro
fuente
44
Recortar hace más que esto ... Es recorta \t\n\r\0\x0Btambién
Arian Faurtosh
3
No solo eso, sino que esto arruinará los elementos con espacio.
Adam Kiss
-11

recortar y explotar

$ str = 'rojo, verde, azul, naranja';

$ str = recortar ($ str);

$ strArray = explotar (',', $ str);

print_r ($ strArray);

Anil M Saini
fuente
55
Esto solo elimina espacios en blanco desde el principio y el final de una cadena, no entre cada color.
SeanWM