Как я могу взорвать и обрезать пробелы?


Например, я хотел бы создать массив из элементов в этой строке:

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

Я знаю, что вы можете взорваться, прокрутить их и обрезать:

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

Но я чувствую, что есть однолинейный подход, который может справиться с этим. Есть какие-нибудь идеи?

Author: dreftymac, 2013-10-13

9 answers

Вы можете сделать следующее с помощью массив_мап:

$new_arr = array_map('trim', explode(',', $str));
 336
Author: SeanWM, 2013-10-13 15:42:19

Улучшенный ответ

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

Результат:

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

Это

  • Разбивается только на запятые
  • Удаляет пробелы из каждого элемента.
  • Игнорирует пустые элементы
  • Не разделяет элемент с внутренними пробелами, такими как "зеленая вещь"
 35
Author: Amr ElAdawy, 2018-08-28 09:16:35

Следующее также заботится о пробелах в начале/конце входной строки:

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

И это минимальный тест с пробелами в каждой разумной позиции:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);
 19
Author: Diego Perini, 2014-01-02 20:11:42

Вы также можете сделать это с помощью регулярного выражения в одну строку

preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
 2
Author: Dom, 2014-07-01 12:14:57

Попробуйте это:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');
 1
Author: Jason OOO, 2013-10-13 15:45:26

В частности, для примерной строки OP, поскольку каждая подстрока, с которой нужно сопоставить, представляет собой одно слово, вы можете использовать str_word_count().

Код: (Демонстрационный)

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

Вывод:

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

Это также можно адаптировать для подстрок, выходящих за рамки букв (и некоторых дефисов и апострофов - если вы читаете мелкий шрифт), добавив необходимые символы в маску символов /3-й параметр.

Код: (Демонстрационная версия)

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

Вывод:

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

Опять же, я рассматриваю этот вопрос очень узко из-за строки образца, но это обеспечит тот же желаемый результат:

Код: (Демонстрационный)

$str = ' red,     green,     blue ,orange ';
var_export(preg_match_all('/[^, ]+/',$str,$out)?$out[0]:'fail');
 0
Author: mickmackusa, 2017-12-02 14:51:31

Для этого вы можете использовать preg_split().

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

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */
 -1
Author: Sutandiono, 2013-10-13 15:49:48
$str = str_replace(" ","", $str);
 -4
Author: BlackWhite, 2013-10-13 16:01:07

Обрезать и взорвать

$str = 'красный, зеленый, синий, оранжевый';

$str = обрезка($str);

$strArray = взорваться(',',$str);

Print_r($strArray);

 -9
Author: Anil M Saini, 2015-08-01 07:07:21