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 :)

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top