Explode only by last delimiter

后端 未结 11 1671
隐瞒了意图╮
隐瞒了意图╮ 2021-01-03 17:30

is there a way to use explode function to explode only by last delimiter occurrence?

$string = "one_two_  ... _three_four";

$explodeResultArray = e         


        
相关标签:
11条回答
  • 2021-01-03 18:18

    Straightforward:

    $parts = explode('_', $string);
    $last = array_pop($parts);
    $parts = array(implode('_', $parts), $last);
    echo $parts[0]; // outputs "one_two_three"
    

    Regular expressions:

    $parts = preg_split('~_(?=[^_]*$)~', $string);
    echo $parts[0]; // outputs "one_two_three"
    

    String reverse:

    $reversedParts = explode('_', strrev($string), 2);
    echo strrev($reversedParts[0]); // outputs "four"
    
    0 讨论(0)
  • 2021-01-03 18:19

    I chose to use substring becasue you want a string up to a particular point:

    $string = "one_two_three_four_five_six_seven";
    $part1 = substr("$string",0, strrpos($string,'_'));
    $part2 = substr("$string", (strrpos($string,'_') + 1));
    var_dump($part1,$part2);
    

    RESULTS:

    string(27) "one_two_three_four_five_six"
    string(5) "seven"
    
    0 讨论(0)
  • 2021-01-03 18:20
    <?php
    $lastPos = strrpos($string, '_');
    if ($lastPos !== false) {
        $start = substr($string, 0, $lastPos);
        $end = substr($string, $lastPos+1);
    } else {
        // no delimeter found!
    }
    

    If you only care about the last part, it's even simpler.

    <?php
    $end = substr(strrchr($string, '_'), 1);
    
    0 讨论(0)
  • 2021-01-03 18:26
    // reverse $string right after definition
    $string = "one_two_three_four_five_six";
    $string = implode("_",array_reverse(explode("_",$string)));
    
    // chop off the first part
    list($result, $string) = explode("_", $string, 2);
    
    echo "$result --- $string";
    

    Output:

    six --- five_four_three_two_one 
    
    0 讨论(0)
  • 2021-01-03 18:26

    I had similar needs and inspired by @NLZ's answer I've made a reusable function with the same features as regular explode(), but backwards (although I added an option to reverse the array order contra regular explode()):

    function backward_explode($delimiter, $string, $limit = null, $keep_order = true) {
        if ((string)$delimiter === "") {
            return false;
        }
    
        if ($limit === 0 || $limit === 1) {
            return array($string);
        }
    
        $explode = explode($delimiter, $string);
    
        if ($limit === null || $limit === count($explode)) {
            return $keep_order? $explode : array_reverse($explode);
        }
    
        $parts = array();
    
        if ($limit > 0) {
            for ($i = 1; $i < $limit; $i++) {
                $parts[] = array_pop($explode);
            }
            $remainder = implode($delimiter, $explode);
            $parts[] = $remainder;
            if ($keep_order) {
                $parts = array_reverse($parts);
            }
        } else {
            if (strpos($string, $delimiter) === false) {
                return array();
            }
            $parts = $explode;
            array_splice($parts, 0, abs($limit));
            if (!$keep_order) {
                $parts = array_reverse($parts);
            }
        }
    
        return $parts;
    }
    

    (Also as a gist.)

    So with:

    $string = 'one two three four';
    var_dump(backward_explode(' ', $string));
    var_dump(backward_explode(' ', $string, 2));
    var_dump(backward_explode(' ', $string, 3));
    var_dump(backward_explode(' ', $string, 2, false));
    var_dump(backward_explode(' ', $string, -1));
    var_dump(backward_explode(' ', $string, 1)); // same as with $limit = 0
    var_dump(backward_explode('#', $string, -2));
    var_dump(backward_explode('', $string, 3));
    

    We get:

    array (size=4)
      0 => string 'one' (length=3)
      1 => string 'two' (length=3)
      2 => string 'three' (length=5)
      3 => string 'four' (length=4)
    array (size=2)
      0 => string 'one two three' (length=13)
      1 => string 'four' (length=4)
    array (size=3)
      0 => string 'one two' (length=7)
      1 => string 'three' (length=5)
      2 => string 'four' (length=4)
    array (size=2)
      0 => string 'four' (length=4)
      1 => string 'one two three' (length=13)
    array (size=3)
      0 => string 'two' (length=3)
      1 => string 'three' (length=5)
      2 => string 'four' (length=4)
    array (size=1)
      0 => string 'one two three four' (length=18)
    array (size=0)
      empty
    boolean false
    
    0 讨论(0)
提交回复
热议问题