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

167

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

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

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

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

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

SeanWM
источник

Ответы:

449

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

$new_arr = array_map('trim', explode(',', $str));
SeanWM
источник
10
Это также зацикливается (внутренне) PHP
Jason OOO
2
это .... спасло .... мою ... жизнь .... я пытался манипулировать файлом через fseek, чтобы добавить его в конец файла ... как только я решил разбить его на массив и переписать файл, я видел, что все время добавлялись дополнительные пробелы ... это + взрыв спас мою чокнутую жизнь .. Теперь я могу есть еду.
jenki221
4
@JasonOOO Я думаю, что, по мнению большинства людей, пара миллисекунд (если даже это) является справедливым компромиссом для получения короткой, простой и легко читаемой строки кода.
Гэвин
Просто и легко понять. Однако, если речь идет о больших наборах данных, то более эффективный ответ, предоставляемый @ amr-eladwy, является лучшим решением.
Ярон
я люблю этот кусок кода и возвращаюсь на этот сайт время от времени!
Patrickzzz
52

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

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

Результат:

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

это

  • Разделяет только запятые
  • Обрезает пробелы от каждого элемента.
  • Игнорирует пустые предметы
  • Не разбивает элемент с внутренними пробелами, как "зеленая вещь"
Amr ElAdawy
источник
7
Может кто-нибудь объяснить мне, почему этот ответ не имеет 100 голосов? Regexp сложно понять, но он проанализировал мой файл размером 100 МБ быстрее, чем другие решения
Дан
2
Я рад, что вы нашли это полезным. Я прочитал все ответы и пришел с лучшей смесью. Регулярное выражение может быть объяснено в деталях.
Amr ElAdawy
2
Извините, но это регулярное выражение неверно - попробуйте заменить redна *red*. Лучшим может быть / (\ s *, \ s *) + /
Грег
@AmrElAdawy FYI больше не работает после обновления 8/28. С регулярным выражением в ответе «как есть», пробел не обрезается от некоторых элементов. Пример: "зеленая вещь".
Samsquanch
1
@Samsquanch обновлен. Пожалуйста, дайте мне знать, если вы видите какие-либо проблемы.
Amr ElAdawy
25

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

$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);
Диего Перини
источник
Поскольку array_mapрешения regexp дают одинаковые результаты, кто-нибудь может сравнить их производительность?
Дан
@Dan Для таких случаев, это не будет никакой разницы.
Арис
4

это как заменить и взорвать в одной строке кода

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

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

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

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => orange
)
Амит Шарма
источник
3

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

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, как указано в этом ответе, чтобы удалить его, но как только вы это сделаете, технически нет необходимости удалять последовательные запятые через регулярное выражение, таким образом, сокращенное выражение

shmurf
источник
2

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

preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
Дом
источник
1

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

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');
Джейсон ООО
источник
ОП хочет массив. preg_replace()не генерирует массив из строки. Это правильный ответ на неправильный вопрос. Downvoted.
mickmackusa
1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');небольшая модификация реабилитирует ответ
dreftymac
1

Специально для образца строки 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',
)

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

Код: ( Демо )

$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');
mickmackusa
источник
0

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

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

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */
Sutandiono
источник
Это разделит пробелы в ваших элементах
Крис К.Л.
Переместите запятую влево от квадратных скобок, чтобы получить запятую.
Эрик Лещинский
Перемещение запятой влево не решит этого. Пожалуйста, проверьте мой ответ ниже stackoverflow.com/a/38300330/5079380
Amr ElAdawy
-4
$str = str_replace(" ","", $str);
Черно-белый
источник
4
Трим делает больше, чем это ... Это \t\n\r\0\x0Bтакже урезает
Ариан Фауртош
3
И не только это, но это испортит элементы с пространством.
Адам Кисс
-11

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

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

$ str = trim ($ str);

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

print_r ($ strArray);

Анил М Сайни
источник
5
Это удаляет только пробелы в начале и конце строки, а не между каждым цветом.
SeanWM