* @param string $string * @param string $delimiter * @param int $nth * @return string */ Str::macro('segment', function ($string, $delimiter, $nth) { $segments = explode($delimiter, $string); if ($nth < 0) { $segments = array_reverse($segments); $nth = abs($nth) - 1; } elseif ($nth == 0) { $nth++; } else { $nth--; } return isset($segments[$nth]) ? $segments[$nth] : ''; }); } if (!Str::hasMacro('shift')) { /** * Shift off the first segment of a string based on a delimiter. * Returns the remaining string. * * @param string $string * @param string $delimiter * @return string */ Str::macro('shift', function ($string, $delimiter) { return Str::replaceFirst(Str::firstSegment($string, $delimiter) . $delimiter, '', $string); }); }