¿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?

Respuestas:


449

Puede hacer lo siguiente usando array_map :

$new_arr = array_map('trim', explode(',', $str));

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"

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

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
)

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


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

1

prueba esto:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');

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



-11

recortar y explotar

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

$ str = recortar ($ str);

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

print_r ($ strArray);


55
Esto solo elimina espacios en blanco desde el principio y el final de una cadena, no entre cada color.
SeanWM
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.