我从mb_substr()
中得到了非常奇怪的结果,这与文档所描述的预期行为背道而驰:当我传入最后两个参数时,mb_substr()
返回一个空白字符串。如果我完全省略了最后两个参数,它将返回预期的结果。是我遗漏了什么,还是我的语法有问题编辑:我想知道这是否是由于服务器设置造成的,因为当我在使用MAMP的本地服务器上使用代码时,这并没有发生。
文档:
mb_substr ( string $str, int $start, int $length, string $encoding )
应返回由start
和length
参数指定的str
部分。
length
要从字符串中使用的最大字符数。如果忽略或传递NULL,请将所有字符提取到字符串末尾
在php.net 上查看
我的代码:
$mb2 = mb_substr('Hello I am a string', 6, NULL, 'UTF-8');
echo 'mb2: ' . $mb2;
预期行为:
mb2:我是字符串
实际结果:
mb2:
我修改的代码:
$mb2 = mb_substr('Hello I am a string', 6);
echo 'mb2: ' . $mb2;
实际结果:
mb2:我是字符串
一切都取决于您使用的PHP版本。我刚刚在本地主机上测试了它,更改了PHP版本。
对于以下代码:
<?php
$mb2 = mb_substr('Hello I am a string', 6, NULL, 'UTF-8');
echo 'mb2: ' . $mb2;
PHP5.6输出:mb2: I am a string
PHP 5.5.11输出:mb2: I am a string
PHP 5.4.31输出:mb2: I am a string
PHP5.3.29输出:mb2:
因此,在以前的PHP版本中似乎有一个错误,或者PHP文档发生了变化,而以前有另一个PHP文档。
为了创建安全的代码(也可以在PHP 5.3中使用),您可以使用:
<?php
mb_internal_encoding('UTF-8');
$mb2 = mb_substr('Hello I am a string', 6);
echo 'mb2: ' . $mb2;
这将在所有PHP 5.3+版本中给出相同的结果
编辑
查看PHP变更日志,您可以阅读:
允许将null作为默认值传递给mb_substr()和mb_strcut()。Alexander Moskaliov通过GitHub PR#133发布的补丁。
从5.4.8开始,所以从这个版本开始,它应该可以很好地工作
这是正确的使用方法。正如注释中所说,传递为NULL会将其解释为0。
$mb2 = mb_substr('Hello I am a string',6,mb_strlen('Hello I am a string'),'utf-8');
http://ideone.com/wYPYWM