mb_substr()返回一个空白字符串,除非最后两个参数被省略


mb_substr() returns a blank string UNLESS last two parameters are omitted

我从mb_substr()中得到了非常奇怪的结果,这与文档所描述的预期行为背道而驰:当我传入最后两个参数时,mb_substr()返回一个空白字符串。如果我完全省略了最后两个参数,它将返回预期的结果。是我遗漏了什么,还是我的语法有问题编辑:我想知道这是否是由于服务器设置造成的,因为当我在使用MAMP的本地服务器上使用代码时,这并没有发生。

文档:

mb_substr ( string $str, int $start, int $length, string $encoding )应返回由startlength参数指定的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