2012-12-20 24 views
6

Mit substr() Sie den dritten Parameter weglassen können den ganzen Rest der Zeichenfolge zu erhalten:Erhalten Rest des Strings bis zum Ende mit mb_substr() und noch gesetzt Codierung

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

Sie können nicht das gleiche tun mit mb_substr():

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

fand ich nur komisch und hässlich Lösungen.

  • Einstellung eine sehr hohe Zahl als Länge:

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

  • Berechnung der Anzahl:

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

  • der charset Parameter Weglassen von mb_internal_encoding() mit:

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

Gibt es keine wirkliche Lösung?

+0

Nicht zu verstehen, warum 'mb_substr ('abcdefg', 2, null, 'UTF-8')' nicht das erreicht, was Sie in Szenarien benötigen, in denen Sie das letzte (kodierende) optionale Argument angeben müssen. – ficuscr

+0

@ficuscr, weil das nichts ausgibt: http://sandbox.onlinephpfufts.com/code/407e2a6c7d00f7002054a069fef3ca510061c747 –

+1

http://codepad.viper-7.com/KZ33rR – ficuscr

Antwort

2

Änderungsprotokoll zeigt dies als Bugfix in Version 5.4.8 (18-Oktober-2012).

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

Allow vorbei null als Standardwert() und mb_strcut(), um mb_substr. Patch von Alexander Moskaliov über GitHub PR # 133.

Hier ist ein Link auf die Anfrage Zugfaden auch: https://github.com/php/php-src/pull/133

+0

Bist du sicher 'mb_substr ('abcdefg', 2, -1, 'UTF-8');' gibt dir "cdefg" in PHP 5.2.17 und nicht "cdef"? – AndreKR

+0

@AndreKR Sie sind richtig. Das wurde zurückgesetzt, als ich das Formular erneut gepostet habe. Ich denke, ich werde meine php.net-Zugangsdaten ausgraben und versuchen, einen Warnhinweis auf dieser Seite zu bekommen, in den Kommentaren, wenn kein anderer Ort. Überrascht, dass ich noch nicht mit all dem alten PHP-Code, den ich gesehen habe, gebrannt habe. – ficuscr

2

Dies ist ein Unterschied zwischen PHP 5.3 (und wahrscheinlich auch in früheren Versionen) und PHP 5.4.

Eigentlich können Sie das Problem im Quellcode von PHP sehen, wenn Sie neugierig sind.

Es ist die Datei ext/mbstring/mbstring.c, die den folgenden Unterschied in der PHP_FUNCTION(mb_substr) Funktion hat.

In PHP 5.3 sie für diesen Zustand überprüfen:

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

Während in PHP 5.4 sie verwenden:

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

Sie können diese Definitionen in der Umsetzung der mb_string Funktion finden welches von PHP_FUNCTION(mb_substr) in der erwähnten Datei gestartet wird. Der Quellcode kann von php.net download page heruntergeladen werden.