【问题标题】:How can I explode and trim whitespace?如何分解和修剪空白?
【发布时间】:2013-10-21 05:42:13
【问题描述】:

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

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

我知道你可以爆炸并循环穿过它们并修剪:

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

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

【问题讨论】:

    标签: php explode trim higher-order-functions


    【解决方案1】:

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

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

    【讨论】:

    • 这也是 PHP 循环的(内部)
    • @JasonOOO 我认为在大多数人看来,几毫秒(即使是这样)对于拥有一行简短、简单且易于阅读的代码来说是一个公平的权衡。
    • 简单易懂。但是,如果处理大型数据集,@amr-eladwy 提供的性能更高的答案是更好的解决方案。
    【解决方案2】:

    改进的答案

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

    结果:

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

    这个:

    • 仅以逗号分隔
    • 从每个项目中删除空格。
    • 忽略空项
    • 不拆分带有“绿色事物”等内部空格的项目

    【讨论】:

    • 谁能解释一下为什么这个答案没有 100 票?正则表达式很难理解,但它解析我的 100Mb 文件比其他解决方案更快
    • 抱歉,这个正则表达式是错误的 - 尝试用 *red* 替换 red。一个更好的可能是 /(\s*,\s*)+/
    • @AmrElAdawy 仅供参考,这在 8/28 更新后不再有效。使用答案中的正则表达式,不会从某些元素中修剪空白。例如:`绿色的东西`。
    • 嗨@Samsquanch,你能帮我更多关于更新的信息吗?你有我可以玩的提琴手吗?
    • @Samsquanch 已更新。如果您发现任何问题,请告诉我。
    【解决方案3】:

    以下内容还处理输入字符串开头/结尾处的空格:

    $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 和正则表达式解决方案产生相同的结果,有人可以比较它们的性能吗?
    • @Dan 这样的情况,不会有什么区别。
    【解决方案4】:

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

    $str = 'red,     green,     blue ,orange';
    
    $new_string = explode(',',preg_replace('/\s+/', '', $str));
    

    将结果输出为

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      结果

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

      您可以使用 this answer 中提到的 PREG_SPLIT_NO_EMPTY 来解决此问题,但一旦这样做,技术上就不需要通过正则表达式删除连续的逗号,因此缩短的表达式

      【讨论】:

        【解决方案6】:

        你也可以用一行正则表达式来做到这一点

        preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
        

        【讨论】:

          【解决方案7】:

          试试这个:

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

          【讨论】:

          • OP 想要一个数组。 preg_replace() 不会从字符串生成数组。这是对错误问题的正确答案。投反对票。
          • $list = preg_split("/\s*,\s*/", 'red, green, blue ,orange'); 小修改恢复了答案
          【解决方案8】:

          特别是对于OP的示例字符串,因为要匹配的每个子字符串都是一个单词,所以可以使用str_word_count()

          代码:(Demo)

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

          这也可以通过将必要的字符添加到字符掩码/第三个参数来适应字母以外的子字符串(以及一些连字符和撇号 - 如果您阅读细则)。

          代码:(Demo)

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

          再次,由于示例字符串,我非常狭隘地处理这个问题,但这将提供相同的期望输出:

          代码:(Demo)

          $str = ' red,     green,     blue ,orange ';
          var_export(preg_match_all('/[^, ]+/',$str,$out)?$out[0]:'fail');
          

          【讨论】:

            【解决方案9】:

            您可以为此使用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下方查看我的回答
            【解决方案10】:
            $str = str_replace(" ","", $str);
            

            【讨论】:

            • Trim 的作用不止于此...它还修剪\t\n\r\0\x0B
            • 不仅如此,这还会用空间搞砸元素。
            【解决方案11】:

            修剪和分解

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

            $str = 修剪($str);

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

            print_r($strArray);

            【讨论】:

            • 这只会从字符串的开头和结尾去除空格,而不是在每种颜色之间。
            猜你喜欢
            • 2010-11-14
            • 1970-01-01
            • 2011-01-16
            • 2018-08-26
            • 2017-03-16
            • 1970-01-01
            • 2012-08-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多