Ответ 1
Вы можете сделать следующее с помощью array_map:
$new_arr = array_map('trim', explode(',', $str));
Например, я хотел бы создать массив из элементов в этой строке:
$str = 'red, green, blue ,orange';
Я знаю, что вы можете взорваться и пройти через них и обрезать:
$arr = explode(',', $str);
foreach ($arr as $value) {
$new_arr[] = trim($value);
}
Но я чувствую, что есть однострочный подход, который может справиться с этим. Любые идеи?
Вы можете сделать следующее с помощью array_map:
$new_arr = array_map('trim', explode(',', $str));
Улучшенный ответ
preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red, green thing ,, ,, blue ,orange');
Результат:
Array
(
[0] => red
[1] => green thing
[2] => blue
[3] => orange
)
это
Следующее также заботится о белых пробелах в начале/конце входной строки:
$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);
Объединив некоторые принципы в существующих ответах, я придумал
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, как упомянуто в этом ответе, чтобы удалить его, но как только вы это сделаете, технически нет необходимости удалять последовательные запятые через регулярное выражение, Таким образом, сокращенное выражение
Вы также можете сделать это с помощью однострочного регулярного выражения
preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
попробуйте следующее:
$str = preg_replace("/\s*,\s*/", ",", 'red, green, blue ,orange');
SPECIFICALLY для строки образца 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');
Вы можете использовать preg_split() для этого.
$bar = preg_split ('/[,\s]+/', $str);
print_r ($bar);
/* Result:
Array
(
[0] => red
[1] => green
[2] => blue
[3] => orange
)
*/
$str = str_replace(" ","", $str);
обрезать и взорвать
$str = 'красный, зеленый, синий, оранжевый';
$str = trim ($ str);
$strArray = explode (',', $str);
print_r ($ strArray);