Troncare una Stringa multibyte di n caratteri
Domanda
Sto cercando di ottenere questo metodo in una Stringa di Filtro di lavoro:
public function truncate($string, $chars = 50, $terminator = ' …');
Mi sarei aspettato questo
$in = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890";
$out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …";
e anche questo
$in = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ";
$out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …";
Che è $chars
meno i caratteri della $terminator
stringa.
Inoltre, il filtro deve tagliare alla prima parola limite sotto il $chars
limite, ad es.
$in = "Answer to the Ultimate Question of Life, the Universe, and Everything.";
$out = "Answer to the Ultimate Question of Life, the …";
Sono abbastanza sicuro che questo dovrebbe funzionare con questi passaggi
- sottrarre la quantità di caratteri in terminator massimo di caratteri
- convalidare la stringa è più il limite calcolato o tornare inalterato
- per trovare l'ultimo carattere nella stringa sotto limite calcolato per ottenere il confine di parola
- tagliare la stringa in ultimo spazio o di limite calcolato se no ultimo spazio è trovato
- aggiungere terminatore di stringa
- return string
Tuttavia, ho provato varie combinazioni di str*
e mb_*
le funzioni di ora, ma tutti ceduto risultati errati.Questo non può essere così difficile, così io sono, ovviamente, manca qualcosa.Qualcuno dovrebbe condividere un lavoro di implementazione per questo o indicami una risorsa dove finalmente riesco a capire come fare.
Grazie
P. S.Sì, ho controllato https://stackoverflow.com/search?q=truncate+string+php prima :)
Soluzione
Prova questo:
function truncate($string, $chars = 50, $terminator = ' …') {
$cutPos = $chars - mb_strlen($terminator);
$boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' ');
return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator;
}
Ma è necessario fare in modo che la codifica interna è impostato correttamente.
Altri suggerimenti
Appena scoperto di PHP ha già un multibyte troncare con
mb_strimwidth
— Ottenere la stringa troncata con una larghezza specificata
Non rispetta i confini di parola però.Ma utile comunque!
Io di solito non piace codice appena un intero risposta ad una domanda del genere. Ma anche io sono appena svegliato, e ho pensato che forse la tua domanda mi otterrebbe di buon umore per andare programma per il resto della giornata.
non ho provato a eseguire questo, ma dovrebbe funzionare, o almeno si ottiene il 90% della strada.
function truncate( $string, $chars = 50, $terminate = ' ...' )
{
$chars -= mb_strlen($terminate);
if ( $chars <= 0 )
return $terminate;
$string = mb_substr($string, 0, $chars);
$space = mb_strrpos($string, ' ');
if ($space < mb_strlen($string) / 2)
return $string . $terminate;
else
return mb_substr($string, 0, $space) . $terminate;
}