回答这个问题:
如何获取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)答案 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);
}
但是,当$length
为0
,FALSE
,NULL
或省略时,它无法处理这些案例。
答案 1 :(得分:0)
在我第一次评论的匆忙中,我错过了一个参数 - 我认为应该更像是这样。
$s = 'look at all the thingymajigs';
echo trim( substr( $s, ( strlen( $s ) >= 7 ? -7 : -strlen( $s ) ), strlen( $s ) ) );