Como posso explodir e aparar espaços em branco?


167

Por exemplo, eu gostaria de criar uma matriz a partir dos elementos nesta string:

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

Eu sei que você pode explodir, passar por eles e aparar:

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

Mas sinto que há uma abordagem de uma linha que pode lidar com isso. Alguma ideia?

Respostas:


449

Você pode fazer o seguinte usando o array_map :

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

10
Isso também está em loop (internamente) por PHP
Jason OOO

2
isso .... salvou .... minha ... vida .... eu estava tentando manipular um arquivo via fseek para anexar ao final de um arquivo ... uma vez que decidi dividi-lo em uma matriz e reescrever o arquivo, eu vi que havia espaço em branco extra sendo adicionado o tempo todo ... esse implode salvou minha maldita vida .. Eu posso ir comer comida agora.
Jenki221

4
@ JasononOOO Eu acho que na opinião da maioria das pessoas, alguns milissegundos (se é que isso é) é uma troca justa por ter uma linha de código curta, simples e de fácil leitura.
Gavin

Simples e fácil de se entender. No entanto, se estiver lidando com grandes conjuntos de dados, a resposta mais eficiente fornecida por @ amr-eladwy é a melhor solução.
Yaron

eu amo esse pedaço de código e volto a este site de vez em quando!
patrickzzz

52

Uma resposta melhorada

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

Resultado:

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

este

  • Divide apenas por vírgulas
  • Apara os espaços em branco de cada item.
  • Ignora itens vazios
  • Não divide um item com espaços internos como "coisa verde"

7
Alguém pode me explicar por que essa resposta não tem 100 votos positivos? Regexp é difícil de entender, mas é analisado o meu arquivo de 100MB mais rápido do que outras soluções
Dan

2
Fico feliz que você tenha achado útil. Eu li todas as respostas e vim com uma mistura melhor. A regex pode ser explicada em detalhes.
Amr ElAdawy 18/08/19

2
Desculpe, mas este regex está errado - tente substituir redpor *red*. Um melhor pode ser / (\ s *, \ s *) + / #
Greg Greg

@AmrElAdawy FYI isso não funciona mais após a atualização de 8/28. Com a regex na resposta como está, o espaço em branco não é cortado de alguns dos elementos. Ex: "coisa verde".
Samsquanch 27/03/19

1
@Samsquanch atualizado. Entre em contato se você encontrar algum problema.
Amr ElAdawy 27/03/19

25

O seguinte também cuida dos espaços em branco no início / fim da sequência de entrada:

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

e este é um teste mínimo com espaços em branco em todas as posições sensíveis:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);

Como as array_mapsoluções regexp e produzem resultados idênticos, alguém poderia comparar seu desempenho?
Dan

@ Dan Para casos como este, não haverá diferença.
Aris

4

é assim que você substitui e explode em uma única linha de código

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

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

produzirá os resultados como

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

3

Ao combinar alguns dos princípios nas respostas existentes, criei

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

O raciocínio por trás disso é que encontrei um erro nesta resposta , onde se houver uma vírgula no final da string, ele retornará um elemento em branco na matriz. ie

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

Resulta em

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

Você pode corrigir isso usando PREG_SPLIT_NO_EMPTY, conforme mencionado nesta resposta, para removê-lo, mas depois que você fizer isso tecnicamente, não será necessário remover vírgulas consecutivas por meio do regex, portanto, a expressão abreviada


2

Você também pode fazer isso com um regex de uma linha

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

1

tente isto:

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

O OP quer uma matriz. preg_replace()não gera uma matriz a partir de uma string. Esta é a resposta certa para a pergunta errada. Votado.
Mckmackusa

1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');pequena modificação reabilita a resposta
dreftymac

1

ESPECIFICAMENTE para a sequência de amostra do OP, porque cada substring a ser correspondida é uma única palavra, você pode 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

Resultado:

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

Isso também pode ser adaptado para substrings além de letras (e alguns hífens e apóstrofos - se você ler as letras miúdas) adicionando os caracteres necessários ao parâmetro de máscara de caractere / terceiro.

Código: ( Demo )

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

Resultado:

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

Mais uma vez, estou tratando essa questão de maneira muito restrita por causa da sequência de amostra, mas isso fornecerá a mesma saída desejada:

Código: ( Demo )

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



-11

aparar e explodir

$ str = 'vermelho, verde, azul, laranja';

$ str = trim ($ str);

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

print_r ($ strArray);


5
Isso apenas remove os espaços em branco do início e do fim de uma sequência, não entre cada cor.
SeanWM
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.