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

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

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

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

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

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


person SeanWM    schedule 13.10.2013    source источник


Ответы (11)


Вы можете сделать следующее, используя array_map:

$new_arr = array_map('trim', explode(',', $str));
person SeanWM    schedule 13.10.2013
comment
Это также цикл (внутренний) PHP - person Jason OOO; 13.10.2013
comment
@JasonOOO Я думаю, что, по мнению большинства людей, пара миллисекунд (если даже это) - это справедливый компромисс за то, чтобы строка кода была короткой, простой и легко читаемой. - person Gavin; 05.04.2017
comment
Просто и понятно. Однако, если вы имеете дело с большими наборами данных, более производительный ответ, предоставленный @ amr-eladwy, является лучшим решением. - person Yaron; 11.03.2018

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

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

Результат:

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

Этот

  • Разделяется только запятыми
  • Обрезает пробелы в каждом элементе.
  • Игнорирует пустые элементы
  • Не разделяет предмет с внутренними пробелами, такими как «зеленая вещь».
person Amr ElAdawy    schedule 11.07.2016
comment
Может ли кто-нибудь объяснить мне, почему в этом ответе нет 100 голосов? Regexp сложно понять, но он проанализировал мой файл размером 100 МБ быстрее, чем другие решения - person Dan; 18.08.2016
comment
Извините, но это неправильное регулярное выражение - попробуйте заменить red на *red*. Лучше может быть / (\ s *, \ s *) + / - person Greg; 09.08.2018
comment
@AmrElAdawy К вашему сведению, это больше не работает после обновления от 28 августа. С регулярным выражением в ответе как есть пустое пространство не удаляется из некоторых элементов. Пример: `зеленая вещь`. - person Samsquanch; 27.03.2019
comment
Привет, @Samsquanch, не могли бы вы подробнее рассказать об этом обновлении? У тебя есть скрипач, с которым я могу поиграть? - person Amr ElAdawy; 27.03.2019
comment
@AmrElAdawy, пожалуйста: phpliveregex.com/p/rrI#tab-preg- разделить - person Samsquanch; 27.03.2019
comment
@Samsquanch обновлен. Пожалуйста, дайте мне знать, если вы заметите какие-либо проблемы. - person Amr ElAdawy; 27.03.2019
comment
Почему ваше регулярное выражение не обрезает пробелы вокруг строки? Пример: «красный, зеленый, синий, оранжевый». - person wp-mario.ru; 22.07.2020

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

$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);
person Diego Perini    schedule 02.01.2014
comment
Поскольку решения array_map и regexp дают одинаковые результаты, может ли кто-нибудь сравнить их производительность? - person Dan; 18.08.2016
comment
@Dan Для подобных случаев разницы не будет. - person Aris; 25.08.2016

это то, как вы заменяете и взрываете в одной строке кода

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

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

выведет результаты как

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

Объединив некоторые принципы из существующих ответов, я пришел к

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

Причина в том, что я обнаружил ошибку в этом ответе, где, если в конце строки стоит запятая он вернет пустой элемент в массиве. т.е.

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

Результаты в

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

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

person shmurf    schedule 07.08.2019

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

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

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

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');
person Jason OOO    schedule 13.10.2013
comment
OP хочет массив. preg_replace() не создает массив из строки. Это правильный ответ на неправильный вопрос. Проголосовали против. - person mickmackusa; 02.12.2017
comment
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange'); незначительное изменение исправляет ответ - person dreftymac; 04.08.2018

КОНКРЕТНО для образца строки 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');
person mickmackusa    schedule 02.12.2017

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

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

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */
person Sutandiono    schedule 13.10.2013
comment
Это разделится на пробелы в ваших элементах - person Chris KL; 05.05.2014
comment
Переместите запятую слева от квадратных скобок, чтобы запятая стала обязательной. - person Eric Leschinski; 02.12.2014
comment
Перемещение запятой влево этого не решит. Пожалуйста, проверьте мой ответ ниже stackoverflow.com/a/38300330/5079380 - person Amr ElAdawy; 11.07.2016

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

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

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

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

print_r ($ strArray);

person Anil M Saini    schedule 01.08.2015
comment
Это удаляет пробелы только в начале и в конце строки, но не между каждым цветом. - person SeanWM; 03.08.2015

person    schedule
comment
Обрезка делает больше, чем это ... Она также подрезает \t\n\r\0\x0B - person Arian Faurtosh; 10.06.2014
comment
Не только это, но это испортит элементы с пространством. - person Adam Kiss; 26.08.2015