【问题标题】:Exploding by Array of Delimiters按分隔符数组爆炸
【发布时间】:2011-02-21 01:27:02
【问题描述】:

有没有办法使用分隔符数组来explode()?

PHP 手册:

数组爆炸(字符串 $delimiter , string $string [, int $limit ] )

除了使用string $delimiter之外,有什么方法可以使用array $delimiter而不会对性能造成太大影响?

【问题讨论】:

    标签: php explode


    【解决方案1】:
    $str = 'Monsters are SUPER scary, bro!';
    $del = array('a', 'b', 'c');
    
    // In one fell swoop...
    $arr = explode( $del[0], str_replace($del, $del[0], $str) );
    

    【讨论】:

    • 这应该比正则表达式更快,不错。
    • 这真是令人惊叹、出色而简单的解决方案,赞!
    • 很棒,但我更喜欢 Ale 的版本。这与尾随的第一个分隔符出现故障。
    • @user568109 我确定我只是缺乏想象力,但我没有看到其中的错误/故障。
    • 在研究这个页面太久之后,我猜 65Fbef05 的答案已经改变以解决这个错误。
    【解决方案2】:

    preg_split() 与适当的正则表达式一起使用。

    【讨论】:

    • 例如:print_r(preg_split("/[,. ]/", "0 1,2.3")); 会给你Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3)
    • print_r(preg_split("/[,\. ]/", "0 1,2.3")); 你的意思是 :) 不过谢谢,我猜这可能是最好的方法。
    【解决方案3】:
    function explode_by_array($delim, $input) {
      $unidelim = $delim[0];
      $step_01 = str_replace($delim, $unidelim, $input); //Extra step to create a uniform value
      return explode($unidelim, $step_01);
    }
    

    这是改进了@65Fbef05 的代码。我们使用第一个分隔符,因为"+delim+" 可能在原始字符串中使用。

    【讨论】:

      【解决方案4】:

      如果第一个定界符之后的定界符包含第一个定界符中的字符,则上述建议将不起作用。例如,如果您想使用换行符作为分隔符,但不确定您的输入是使用 \r\n、\r 还是只是 \n,则不能使用上述方法。

      $str = '___RN___RN___R___N___RN___RN';
      $del = array('RN', 'R', 'N');
      
      # This won't work if delimiters 2, 3, n include characters from delimiter 1
      var_dump(explode( $del[0], str_replace($del, $del[0], $str)));
      

      这将输出:

      array(11) {
        [0]=>
        string(4) "___R"
        [1]=>
        string(0) ""
        [2]=>
        string(4) "___R"
        [3]=>
        string(0) ""
        [4]=>
        string(4) "___R"
        [5]=>
        string(3) "___"
        [6]=>
        string(4) "___R"
        [7]=>
        string(0) ""
        [8]=>
        string(4) "___R"
        [9]=>
        string(0) ""
        [10]=>
        string(0) ""
      }
      

      如果您打算进行字符串比较,这并不理想。相反,您需要变得更复杂一些。我在下面写的可能不是最有效和最简洁的,但它可以解决问题。

      # This, however, will work
      function array_explode($delimiters, $string){
          if(!is_array(($delimiters)) && !is_array($string)){
              //if neither the delimiter nor the string are arrays
              return explode($delimiters,$string);
          } else if(!is_array($delimiters) && is_array($string)) {
              //if the delimiter is not an array but the string is
              foreach($string as $item){
                  foreach(explode($delimiters, $item) as $sub_item){
                      $items[] = $sub_item;
                  }
              }
              return $items;
          } else if(is_array($delimiters) && !is_array($string)) {
              //if the delimiter is an array but the string is not
              $string_array[] = $string;
              foreach($delimiters as $delimiter){
                  $string_array = array_explode($delimiter, $string_array);
              }
              return $string_array;
          }
      }
      
      var_dump(array_explode($del,$str));
      

      它将输出以下内容:

      array(7) {
        [0]=>
        string(3) "___"
        [1]=>
        string(3) "___"
        [2]=>
        string(3) "___"
        [3]=>
        string(3) "___"
        [4]=>
        string(3) "___"
        [5]=>
        string(3) "___"
        [6]=>
        string(0) ""
      }
      

      玩一玩:https://3v4l.org/bJOkI

      【讨论】:

        【解决方案5】:

        php 的explode 方法不支持多个分隔符,所以不能传递给它一个数组。 另外,您正在解析具有多个分隔符的哪种字符串?最好的办法是遍历定界符,然后重新分解一些已分解的字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-24
          • 2011-01-11
          相关资源
          最近更新 更多