есть ли способ использовать функцию взрыва, чтобы взорваться только по последнему разлому?
$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