Я пришел на эту страницу в поисках метода среза slice($start, $end)
, но нашел только решения для конкретного случая.
В моем случае у меня есть только индексы (начало и конец). Потребность в length
для нарезки струны казалась глупой. Поэтому я написал функцию среза. Он имитирует метод JavaScript slice .
// str_slice(string $str, int $start [, int $end])
function str_slice() {
$args = func_get_args();
switch (count($args)) {
case 1:
return $args[0];
case 2:
$str = $args[0];
$str_length = strlen($str);
$start = $args[1];
if ($start < 0) {
if ($start >= - $str_length) {
$start = $str_length - abs($start);
} else {
$start = 0;
}
}
else if ($start >= $str_length) {
$start = $str_length;
}
$length = $str_length - $start;
return substr($str, $start, $length);
case 3:
$str = $args[0];
$str_length = strlen($str);
$start = $args[1];
$end = $args[2];
if ($start >= $str_length) {
return "";
}
if ($start < 0) {
if ($start < - $str_length) {
$start = 0;
} else {
$start = $str_length - abs($start);
}
}
if ($end <= $start) {
return "";
}
if ($end > $str_length) {
$end = $str_length;
}
$length = $end - $start;
return substr($str, $start, $length);
}
return null;
}
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz") ); // "abcdefghijklmnopqrstuvwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 5) ); // "fghijklmnopqrstuvwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -5) ); // "vwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 40) ); // ""
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -40) ); // "abcdefghijklmnopqrstuvwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 5, 10) ); // "fghij"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 5, 20) ); // "fghijklmnopqrst"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", 5, 30) ); // "fghijklmnopqrstuvwxyz"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -20, 2) ); // ""
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -20, 10) ); // "ghij"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -20, 15) ); // "ghijklmno"
var_dump( str_slice("abcdefghijklmnopqrstuvwxyz", -20, 40) ); // "ghijklmnopqrstuvwxyz"