6

3 番目のパラメーターを省略して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

これは、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 に答える
2

変更ログは、これをバージョン 5.4.8 (2012 年 10 月 18 日) のバグ修正として示しています。

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

mb_substr() および mb_strcut() にデフォルト値として null を渡すことを許可します。Alexander Moskaliov による GitHub PR #133 によるパッチ。

プル リクエスト スレッドへのリンクもここにあります: https://github.com/php/php-src/pull/133

于 2012-12-20T21:07:46.117 に答える