使用 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);
}
但是,它不处理 $length
为 0
、FALSE
、NULL
或省略的情况。
在第一条评论的匆忙中我错过了一个参数 - 我认为它应该更像这样。
$s = 'look at all the thingymajigs';
echo trim( substr( $s, ( strlen( $s ) >= 7 ? -7 : -strlen( $s ) ), strlen( $s ) ) );
本题答案:
如何获取 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);
}
但是,它不处理 $length
为 0
、FALSE
、NULL
或省略的情况。
在第一条评论的匆忙中我错过了一个参数 - 我认为它应该更像这样。
$s = 'look at all the thingymajigs';
echo trim( substr( $s, ( strlen( $s ) >= 7 ? -7 : -strlen( $s ) ), strlen( $s ) ) );