2012-12-20 12 views
6

Con substr() è possibile omettere il terzo parametro per ottenere tutto il resto della stringa:Ottenere resto della stringa alla fine con mb_substr() e ancora impostare la codifica

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

Non si può fare lo stesso con mb_substr():

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

ho trovato solo soluzioni strane e brutte.

  • impostazione di un numero molto alto come lunghezza:

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

  • Calcolo del numero:

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

  • omissione del parametro charset utilizzando 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);

non c'è una vera soluzione?

+0

Non capisco perché 'mb_substr ('abcdefg', 2, null, 'UTF-8')' non realizza ciò che si desidera in scenari in cui è necessario fornire l'argomento opzionale finale (codifica). – ficuscr

+0

@ficuscr, perché non viene prodotto nulla: http://sandbox.onlinephpfunctions.com/code/407e2a6c7d00f7002054a069fef3ca510061c747 –

+1

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

risposta

2

Registro modifiche mostra questo come una correzione di bug nella versione 5.4.8 (18-ottobre-2012).

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

Consentire passando null come valore predefinito per mb_substr() e mb_strcut(). Patch di Alexander Moskaliov tramite GitHub PR # 133.

Questo è il link per la richiesta di discussione di pull anche: https://github.com/php/php-src/pull/133

+0

Sei sicuro di 'mb_substr ('abcdefg', 2, -1, 'UTF-8');' ti dà "cdefg" in PHP 5.2.17 e non "cdef"? – AndreKR

+0

@AndreKR sei corretto. Quel reset quando ho ripubblicato il modulo. Penso che scaverò le mie credenziali php.net e cercherò di ottenere un'avvertenza di avviso pubblicata su quella pagina, nei commenti se non altrove. Sorpreso di non essere stato ancora bruciato da questo con tutto il codice PHP stantio che vedo. – ficuscr

2

Questa è una differenza tra PHP 5.3 (e probabilmente anche nelle versioni precedenti) e PHP 5.4.

In realtà, se sei curioso, puoi vedere il problema nel codice sorgente di PHP.

È il file ext/mbstring/mbstring.c che presenta la seguente differenza nella funzione PHP_FUNCTION(mb_substr).

In PHP 5.3 verifica della disponibilità di questa condizione:

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

considerando che PHP 5.4 usano:

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

Potete trovare queste definizioni nella implementazione della funzione mb_string che viene avviato da PHP_FUNCTION(mb_substr) nel file indicato. Il codice sorgente può essere scaricato da php.net download page.

Problemi correlati