如何爆炸和修剪空白?


167

例如,我想根据此字符串中的元素创建一个数组:

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

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

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

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

Answers:


449

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

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

10
这也是循环(内部)由PHP
贾森OOO

2
保存......我的生命...我试图通过fseek操作文件以追加到文件末尾...一旦我决定将其分解为数组并重写在文件中,我看到整个过程中都添加了额外的空格...这种内爆+挽救了我的性命。
jenki221

4
@JasonOOO我认为,在大多数人看来,几毫秒(即使是几毫秒)也是公平的折衷,因为它具有一行简短,简单且易于阅读的代码。
加文

简单易懂。但是,如果处理大型数据集,则@ amr-eladwy提供的性能更高的答案是更好的解决方案。
Yaron

我喜欢这段代码,然后不时返回此站点!
patrickzzz

51

改进的答案

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 Dan

2
很高兴您发现它很有帮助。我阅读了所有答案,并提供了更好的组合。正则表达式可以详细解释。
Amr ElAdawy '16

2
抱歉,此正则表达式是错误的-尝试将其替换red*red*。更好的可能是/(\ s *,\ s *)+ /
Greg

@AmrElAdawy仅供参考,在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对于这种情况,没有任何区别。
阿里斯(Aris)

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');

OP需要一个数组。 preg_replace()不会从字符串生成数组。这是对错误问题的正确答案。不赞成投票。
mickmackusa

1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');较小的修改
就能

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',
)

通过将必要的字符添加到字符掩码/ 3rd参数中,还可以将其改编为超出字母的子字符串(以及一些连字符和撇号-如果您阅读精美的字体)。

代码:(演示

$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');



-11

修剪并爆炸

$ str ='红色,绿色,蓝色,橙色';

$ str = trim($ str);

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

print_r($ strArray);


5
这只会从字符串的开头和结尾去除空白,而不会在每种颜色之间去除空白。
SeanWM 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.