Взорвать только последний делиметр

есть ли способ использовать функцию взрыва, чтобы взорваться только по последнему разлому?

$string = "one_two_ ... _three_four"; $explodeResultArray = explode("_", $string); 

Результат должен быть:

 $expoldeResultArray[0] is "one_two_three ..."; $expoldeResultArray[1] is "four"; 

Непосредственная:

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

Обычные выражения:

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

String reverse:

 $reversedParts = explode('_', strrev($string), 2); echo strrev($reversedParts[0]); // outputs "four" 

Нет необходимости в обходном пути. explode() принимает отрицательный предел.

 $string = "one_two_three_four"; $part = implode('_', explode('_', $string, -1)); echo $part; 

Результат:

 one_two_three 

Вы можете сделать следующее:

 $string = "one_two_three_four"; $explode = explode('_', $string); // split all parts $end = ''; $begin = ''; if(count($explode) > 0){ $end = array_pop($explode); // removes the last element, and returns it if(count($explode) > 0){ $begin = implode('_', $explode); // glue the remaining pieces back together } } 

EDIT: array_shift должен был быть array_pop

Я решил использовать подстроку, потому что вам нужна строка до определенной точки:

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

РЕЗУЛЬТАТЫ:

 string(27) "one_two_three_four_five_six" string(5) "seven" 
 <?php $lastPos = strrpos($string, '_'); if ($lastPos !== false) { $start = substr($string, 0, $lastPos); $end = substr($string, $lastPos+1); } else { // no delimeter found! } 

Если вы заботитесь только о последней части, это еще проще.

 <?php $end = substr(strrchr($string, '_'), 1); 
 // 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"; 

Вывод:

 six --- five_four_three_two_one 

Использовать preg_match ()

 $string = "one_two_three_four"; $arr = array(); preg_match("/(^.*)_(.*?)$/", $string, $arr); print_r($arr); 

Выход: Array ( [0] => one_two_three_four [1] => one_two_three [2] => four )

 $explodeResultArray = explode("_", $string); $last_item = end($explodeResultArray); $key = count($explodeResultArray) - 1; unset($explodeResultArray[$key]); $arr[] = (implode($explodeResultArray,'_')); $arr[] = $last_item; print_r($arr); с $explodeResultArray = explode("_", $string); $last_item = end($explodeResultArray); $key = count($explodeResultArray) - 1; unset($explodeResultArray[$key]); $arr[] = (implode($explodeResultArray,'_')); $arr[] = $last_item; print_r($arr); 

Вывод

 Array ( [0] => one_two_ ... _three [1] => four ) 

У меня были аналогичные потребности, и я вдохновился ответом @ NLZ. Я сделал многоразовую функцию с теми же функциями, что и обычный explode() , но назад (хотя я добавил вариант для изменения порядка массива 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; } 

(Также как сущность).

Итак, с:

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

Мы получаем:

 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