使用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');
使用
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);
难道没有真正的解决方案吗?
更改日志显示这是5.4.8版(2012年10月18日(中的一个错误修复。
http://us.php.net/ChangeLog-5.php
允许将null作为默认值传递给mb_substr((和mb_strcut((。Alexander Moskaliov通过GitHub PR#133发布的补丁。
这里还有一个到pull请求线程的链接:https://github.com/php/php-src/pull/133
这是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;
}
您可以在上述文件中PHP_FUNCTION(mb_substr)
启动的mb_string
函数的实现中找到这些定义。源代码可以从php.net下载页面下载。