使用 PHP substr 从字符串中获取 "at most" 最后 n 个字符?

Get "at most" last n characters from string using PHP substr?

本题答案:

如何获取 PHP 字符串的最后 7 个字符? - 堆栈溢出 How can I get the last 7 characters of a PHP string?

显示此语句:

substr($s, -7)

但是,如果 $s 的长度小于 7,它将 return 空字符串(在 PHP 5.2.6 上测试),例如

substr("abcd", -4) returns "abcd"
substr("bcd", -4) returns nothing

目前,我的解决方法是

trim(substr("   $s",-4)) // prepend 3 blanks

有没有其他优雅的方式来写substr()可以更完美?

====

编辑:对于我的 post 中 substr("bcd", -4) 的 return 值的拼写错误,我们深表歉意。在这里误导人。它应该 return 什么都没有。我已经更正了。 (@2016/1/29 17:03 GMT+8)

substr("abcd", -4) returns "abcd"
substr("bcd", -4) returns "bcd"

这是 substr() 的正确行为。

PHP 版本 5.2.2-5.2.6 中的 substr() 函数存在一个错误,当它的第一个参数 (start) 为负数,其绝对值大于字符串的长度。

行为是 documented

您应该将 PHP 升级到更新的版本(5.6 或 7.0)。 PHP 5.2 是 dead and buried 5 年多以前的事了。

或者至少将 PHP 5.2 升级到最新版本 (5.2.17)


针对您的请求的优雅解决方案(假设您被错误的 PHP 版本锁定):

function substr52($string, $start, $length)
{
    $l = strlen($string);
    // Clamp $start and $length to the range [-$l, $l]
    // to circumvent the faulty behaviour in PHP 5.2.2-5.2.6
    $start  = min(max($start, -$l), $l);
    $length = min(max($start, -$l), $l);

    return substr($string, $start, $length);
}

但是,它不处理 $length0FALSENULL 或省略的情况。

在第一条评论的匆忙中我错过了一个参数 - 我认为它应该更像这样。

$s = 'look at all the thingymajigs';
echo trim( substr( $s, ( strlen( $s ) >= 7 ? -7 : -strlen( $s ) ), strlen( $s ) ) );