206

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

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

我知道您可以爆炸并遍历它们并修剪:

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

但我觉得有一种方法可以解决这个问题。有任何想法吗?

4

11 回答 11

528

您可以使用array_map执行以下操作:

$new_arr = array_map('trim', explode(',', $str));
于 2013-10-13T15:42:19.240 回答
70

改进的答案

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

结果:

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

这个:

  • 仅以逗号分隔
  • 修剪每个项目的空白。
  • 忽略空项目
  • 不拆分具有内部空间的项目,如“绿色的东西”
于 2016-07-11T06:20:12.963 回答
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);
于 2014-01-02T20:11:42.690 回答
8

这就是你如何在一行代码中替换和分解

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

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

将结果输出为

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => orange
)
于 2019-11-27T10:49:05.653 回答
5

通过结合我想出的现有答案中的一些原则

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

其背后的原因是我在这个答案中发现了一个错误,如果字符串末尾有逗号,它将在数组中返回一个空白元素。IE

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将其删除来解决此问题,但是一旦这样做,技术上就不需要通过正则表达式删除连续的逗号,因此缩短的表达式

于 2019-08-07T21:54:44.083 回答
2

您也可以使用单行正则表达式执行此操作

preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
于 2014-07-01T12:14:57.910 回答
1

尝试这个:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');
于 2013-10-13T15:45:26.207 回答
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');
于 2017-12-02T14:51:31.100 回答
-1

您可以为此使用preg_split()

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

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */
于 2013-10-13T15:49:48.010 回答
-4
$str = str_replace(" ","", $str);
于 2013-10-13T15:45:25.457 回答
-12

修剪和爆炸

$str = '红、绿、蓝、橙';

$str = 修剪($str);

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

print_r($strArray);

于 2015-08-01T07:07:21.013 回答