Як я можу підірвати та обрізати пробіли?


167

Наприклад, я б хотів створити масив з елементів цього рядка:

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

Я знаю, що ви можете вибухнути і пропустити через них і обрізати:

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

Але я відчуваю, що існує єдиний підхід, який може впоратися з цим. Будь-які ідеї?

Відповіді:


449

Ви можете зробити наступне, використовуючи array_map :

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

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
)

Це

  • Розділяється лише на коми
  • Обрізає білі пробіли від кожного елемента.
  • Ігнорує порожні елементи
  • Не розділяє елемент на внутрішні пробіли, наприклад "зелена річ"

7
Хтось може мені пояснити, чому ця відповідь не має 100 оновлених результатів? Regexp важко зрозуміти, але він розібрав мій 100Mb файл швидше, ніж інші рішення
Dan

2
Я радий, що ти знайшов це корисним. Я прочитав усі відповіді і прийшов з кращою сумішшю. Регекс можна пояснити детально.
Amr ElAdawy

2
Вибачте , але це регулярний вираз неправильно - спроба замінити redз *red*. Кращим може бути / (\ s *, \ s *) + /
Грег,

@AmrElAdawy FYI після оновлення 8/28 це більше не працює. З регексу у відповіді як є, простір білого кольору не обробляється з деяких елементів. Наприклад: `зелена річ`.
Самскванч

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

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


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()не створює масив з рядка. Це правильна відповідь на неправильну запитання. Захищений.
mickmackusa

1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange'); незначна модифікація реабілітує відповідь
dreftymac

1

СПЕЦІАЛЬНО для вибіркового рядка ОП, оскільки кожна підрядка, яка повинна відповідати, - це одне слово, ви можете використовувати 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

Ви можете використовувати preg_split () для цього.

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

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */

Це розділиться на пробіли у ваших елементах
Кріс КЛ

Перемістіть кому ліворуч від квадратних дужок, щоб зробити косу необхідною.
Ерік Лещинський

Переміщення коми вліво цього не вирішить. Будь ласка , перевірте мій відповідь нижче stackoverflow.com/a/38300330/5079380
Амр ElAdawy


-11

обрізати і вибухнути

$ str = 'червоний, зелений, синій, помаранчевий';

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

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

print_r ($ strArray);


5
Це лише смужки пробілів від початку та до кінця рядка, а не між кожним кольором.
SeanWM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.