使用PHP substr从字符串中获取“最多”最后n个字符?

时间:2016-01-29 08:21:20

标签: php substr

回答这个问题:

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

显示了这个陈述:

substr($s, -7)

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

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

目前,我的解决方法是

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

还有另一种优雅的方法来编写substr(),以便它可以更完美吗?

====

编辑:对不起,我的帖子中输入了substr(“bcd”, - 4)的返回值。它在这里误导了人们。它应该什么也不返回。我已经纠正了。 (@ 2016/1/29 17:03 GMT + 8)

2 个答案:

答案 0 :(得分:1)

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

这是substr()的正确行为。

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

行为是documented

您应该将PHP升级到较新版本(5.6或7.0)。 PHP 5.2在5年多前是dead and buried

或者至少将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或省略时,它无法处理这些案例。

答案 1 :(得分:0)

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

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