例如,我想从这个字符串中的元素创建一个数组:

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

我知道你可以通过爆炸和循环,并修剪:

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

但我觉得有一种方法可以解决这个问题。什么好主意吗?


当前回答

这就是如何在一行代码中替换和爆炸

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

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

将结果输出为

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

其他回答

试试这个:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');

这就是如何在一行代码中替换和爆炸

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

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

将结果输出为

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

特别是对于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');

最后,如果你想用可选的前导或尾随空格分割逗号,下面是调用:(演示)

var_export(
    preg_split ('/ *,+ */', $str, 0, PREG_SPLIT_NO_EMPTY)
);

使用array_map可以完成以下操作:

$new_arr = array_map('trim', explode(',', $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来解决这个问题,就像回答中提到的那样,但是一旦你这样做了,技术上就不需要通过regex删除连续的逗号,从而缩短表达式