Frage

Ich versuche, diese Methode in einer String-Filter Funktion zu erhalten:

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

Ich würde erwarten, dass diese

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

und auch diese

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

Das ist $chars minus die Zeichen des $terminator String.

Darüber hinaus wird der Filter soll Schnitt an der ersten Wortgrenze unterhalb der $chars Grenze, z.

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

Ich bin mir ziemlich sicher, dass das mit diesen Schritten sollte funktionieren

  • subtrahieren Menge von Zeichen in Terminator aus maximal Zeichen
  • Validieren, dass String länger ist als der berechnete Grenzwert oder senden Sie es unverändert
  • Sie das letzte Leerzeichen in string unten berechnet Grenze Wortgrenze
  • bekommen
  • Cut String am letzten Platz oder berechnete Grenze, wenn kein letzter Platz gefunden
  • append Terminator Zeichenfolge
  • zurück Zeichenfolge

Allerdings habe ich jetzt verschiedene Kombinationen von str* und mb_* Funktionen ausprobiert, aber alle falsch Treffer. Dies kann nicht so schwer sein, so dass ich offensichtlich etwas fehle. Würde jemand teilen sich eine funktionierende Implementierung für diese oder zeigen Sie mir auf eine Ressource, wo kann ich endlich verstehen, wie es zu tun.

Danke

P. S. Ja, ich habe geprüft https://stackoverflow.com/search?q=truncate+string+php vor:)

War es hilfreich?

Lösung

Versuchen Sie diese:

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

Aber Sie müssen sicherstellen, dass Ihre interne Codierung richtig eingestellt ist.

Andere Tipps

Just herausgefunden PHP bereits ein Multibyte truncate mit

  • mb_strimwidth - Get abgeschnitten Zeichenfolge mit dem angegebenen Breite

Es ist nicht obey Wortgrenzen though. Aber praktisch dennoch!

ich normalerweise nicht wie gerade Code eine ganze Antwort auf eine Frage wie diese. Aber auch wachte ich gerade auf, und ich dachte, vielleicht Ihre Frage mich in einer guten Stimmung bekommen würde Programm für den Rest des Tages zu gehen.

Ich habe nicht versucht, dies zu laufen, aber es sollte funktionieren oder zumindest Ihnen 90% der Art und Weise erhalten.

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top