2010-01-28 17 views
7

Sto cercando di ottenere questo metodo in un lavoro stringa di filtro:troncare una stringa multibyte di n caratteri

public function truncate($string, $chars = 50, $terminator = ' …'); 

mi aspetto questo

$in = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890"; 
$out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …"; 

e anche questo

$in = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ"; 
$out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …"; 

Questo è $chars meno i caratteri della stringa $terminator.

Inoltre, il filtro dovrebbe tagliare al primo limite di parole sotto il limite $chars, ad es.

$in = "Answer to the Ultimate Question of Life, the Universe, and Everything."; 
$out = "Answer to the Ultimate Question of Life, the …"; 

Io sono abbastanza sicuro che questo dovrebbe funzionare con questi passaggi

  • importo sottrarre di caratteri in terminatore caratteri massimo
  • validate quella stringa è più lungo del limite calcolato o restituirla inalterato
  • trova l'ultimo carattere dello spazio nella stringa sotto il limite calcolato per ottenere il limite della parola
  • taglia la stringa all'ultimo spazio o il limite calcolato se non viene trovato l'ultimo spazio
  • accoda terminatore di stringa
  • stringa di ritorno

Tuttavia, ho provato varie combinazioni di str* e mb_* funzioni ora, ma tutti hanno dato risultati sbagliati. Questo non può essere così difficile, quindi ovviamente mi manca qualcosa. Qualcuno potrebbe condividere un'implementazione funzionante per questo o indicando una risorsa in cui posso finalmente capire come farlo.

Grazie

P.S. Sì, ho controllato prima https://stackoverflow.com/search?q=truncate+string+php :)

+0

È possibile trovare ['s ($ str) -> truncateSafely (50)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L246) utile, come trovato in [questa libreria standalone] (https://github.com/delight-im/PHP-Str). – caw

risposta

3

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.

+0

Doh, ho provato a farlo funzionare da ISO-8859-1. Lo ha cambiato in UTF-8 ora. Grazie Gumbo. Lo accetto come risposta corretta perché contiene l'unica cosa che mi mancava. – Gordon

0

In genere non mi piace solo scrivere un'intera risposta a una domanda come questa. Ma anche io mi sono appena svegliato e ho pensato che forse la tua domanda mi avrebbe messo di buon umore per andare a programmare per il resto della giornata.

Non ho provato a eseguire questo, ma dovrebbe funzionare o almeno ottenere il 90% del modo in cui ci.

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; 
} 
5

appena scoperto PHP ha già troncare una multibyte con

non obbedisce confini di parola però. Ma a portata di mano comunque!

Problemi correlati