6

您可以省略第三个参数以substr()获取字符串的其余部分:

substr('abcdefg', 2) // returns "cdefg"

你不能这样做mb_substr()

mb_substr('abcdefg', 2, null, 'UTF-8'); // returns empty string

我只找到了奇怪和丑陋的解决方案。

  • 将一个非常高的数字设置为长度:

    $a = mb_substr('abcdefg', 2, 9999999999, 'UTF-8');

  • 计算数量:

    $a = mb_substr('abcdefg', 2, mb_strlen('abcdefg', 'UTF-8') - 2, 'UTF-8');

  • 通过使用省略 charset 参数mb_internal_encoding()

    $temp = mb_internal_encoding(); // prevent action at a distance
    mb_internal_encoding('UTF-8');
    $a = mb_substr('abcdefg', 2);
    mb_internal_encoding($temp);

没有真正的解决方案吗?

4

2 回答 2

2

更改日志将此显示为版本 5.4.8(2012 年 10 月 18 日)中的错误修复。

http://us.php.net/ChangeLog-5.php

允许将 null 作为默认值传递给 mb_substr() 和 mb_strcut()。Alexander Moskaliov 通过 GitHub PR #133 提供的补丁。

这里也是拉取请求线程的链接:https ://github.com/php/php-src/pull/133

于 2012-12-20T21:07:46.117 回答
2

这是 PHP 5.3(也可能在早期版本中)和 PHP 5.4 之间的区别。

实际上,如果您好奇的话,您可以在 PHP 的源代码中看到问题所在。

它是ext/mbstring/mbstring.c具有以下PHP_FUNCTION(mb_substr)功能差异的文件。

PHP 5.3中,他们检查这种情况:

if (argc < 3) {
    len = str_len;
}

而在PHP 5.4中,他们使用:

if (argc < 3 || Z_TYPE_PP(z_len) == IS_NULL) {
    len = str_len;
}

您可以在上述文件中mb_string启动的函数的实现中找到这些定义。PHP_FUNCTION(mb_substr)源代码可以从php.net 下载页面下载

于 2012-12-20T21:11:42.823 回答