Exploding by Array of Delimiters

前端 未结 5 1907
伪装坚强ぢ
伪装坚强ぢ 2020-12-05 07:56

Is there any way to explode() using an array of delimiters?

PHP Manual:

array explode ( string $delimiter , string $string [, int $limit ] )

<
5条回答
  •  無奈伤痛
    2020-12-05 08:23

    The above suggestions won't work if the delimiters after the first delimiter include characters from that first delimiter. For instance, if you want to use line breaks as delimiters, but you're not sure if your input uses \r\n, \r or just \n, you can't use the above methods.

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

    This will output:

    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) ""
    }
    

    Which isn't ideal if you're planning to do string comparisons. Instead, you'll need to get a bit more complex. What I have written below may not be the most efficient and succinct, but it does the trick.

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

    It will output the following:

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

    Have a play: https://3v4l.org/bJOkI

提交回复
热议问题