Wer Textvorschauen oder Teaser für Blogartikel erstellt, steht vor einem häufigen Problem: Der Text soll nach einer bestimmten Zeichenzahl gekürzt werden, aber nicht mitten im Wort abbrechen. PHP bietet dafür sowohl eine eingebaute Funktion als auch einfache Möglichkeiten, das selbst umzusetzen.
Die schnelle Lösung: mb_strimwidth()
Seit PHP 4.0.6 gibt es mb_strimwidth(), die einen String auf eine bestimmte Breite kürzt und automatisch einen Anhang wie ... anfügt. Die Funktion ist Multibyte-sicher und funktioniert damit auch korrekt mit Umlauten:
<?php
$text = 'Das ist ein langer Beispieltext für eine Vorschau.';
echo mb_strimwidth($text, 0, 30, '...');
/* Ausgabe: Das ist ein langer Beispie... */
?>
Die Funktion schneidet exakt nach der angegebenen Breite ab. Allerdings trennt sie dabei auch mitten in einem Wort. Für viele Fälle reicht das aus, weil die drei Punkte den Schnitt kaschieren. Wenn der Text aber sauber an einer Wortgrenze enden soll, braucht es eine eigene Lösung.
Text an der Wortgrenze kürzen
Die Idee ist einfach: Zuerst wird der Text mit mb_substr() auf die gewünschte Länge gekürzt. Dann wird mit mb_strrpos() das letzte Leerzeichen im gekürzten Text gesucht und alles danach entfernt.
<?php
function textKuerzen(string $text, int $maxLaenge = 150, string $suffix = '...'): string
{
if (mb_strlen($text) <= $maxLaenge) {
return $text;
}
$gekuerzt = mb_substr($text, 0, $maxLaenge);
/* Letztes Leerzeichen im gekuerzten Text finden */
$letztePosition = mb_strrpos($gekuerzt, ' ');
if ($letztePosition !== false) {
$gekuerzt = mb_substr($gekuerzt, 0, $letztePosition);
}
return $gekuerzt . $suffix;
}
?>
Die Funktion nutzt durchgehend die mb_*-Varianten der String-Funktionen. Dadurch werden Umlaute und andere Sonderzeichen korrekt gezählt und nicht beschädigt.
Beispiel: Die Funktion verwenden
So sieht der Einsatz in der Praxis aus:
<?php
$text = 'PHP bietet viele praktische Funktionen für die Textverarbeitung.';
echo textKuerzen($text, 40);
/* Ausgabe: PHP bietet viele praktische... */
echo textKuerzen($text, 20);
/* Ausgabe: PHP bietet viele... */
echo textKuerzen($text, 200);
/* Ausgabe bleibt unveraendert, da der Text kuerzer als 200 Zeichen ist */
?>
Im ersten Aufruf wird der Text nach 40 Zeichen gekürzt. Da das 40. Zeichen mitten im Wort „Funktionen“ liegt, springt die Funktion zum vorherigen Leerzeichen zurück. Im letzten Aufruf ist der Text kürzer als das Limit und wird daher unverändert zurückgegeben.
Praxistipp: HTML vorher entfernen
Wenn der Text HTML-Tags enthält, zum Beispiel aus einem CMS oder einer Datenbank, sollte man diese vor dem Kürzen mit strip_tags() entfernen. Sonst werden HTML-Tags mitgezählt oder mitten im Tag abgeschnitten:
<?php
$html = '<p><strong>PHP</strong> ist eine serverseitige Programmiersprache.</p>';
$klartext = strip_tags($html);
echo textKuerzen($klartext, 30);
/* Ausgabe: PHP ist eine serverseitige... */
?>
Durch strip_tags() wird der reine Text ohne HTML-Markup extrahiert. Erst danach greift die Kürzung zuverlässig an den Wortgrenzen.