phpBuddy

Tipps & Tricks

PHP Profis von morgen finden hier diverse Tipps & Tricks zu immer wiederkehrende Hürden beim programmieren. Darüber hinaus werden auch weniger bekannte Funktionen anhand von kleinen Beispielen erklärt.

Sie sind hier: Startseite Lange Texte kürzen
Lange Texte nach x Zeichen kürzen

Lange Texte nach x Zeichen kürzen

Auf fast jede Webseite auf der News stehen werden sie eingesetzt - Teaser.
Ein Teaser ist ein kleiner Vorschautext der eigentlichen News, der Appetit auf's Weiterlesen machen soll. Um solche Vorschautexte zu erzeugen gibt es verschiedene Wege:

  • Einen separaten Vorschautext zur News erstellen und diesen ausgeben
  • Die vollständige News auslesen und dann mit PHP x Zeichen abschneiden
  • Mithilfe von MySQL nur einen Teil der News auslesen und ausgeben

Version 1 ist uninteressant für uns, weil der Text schon gekürzt vorliegt. Schauen wir uns also die anderen Varianten an und werfen auch einen Blick auf die Vor- und Nachteile.


Lange Texte mit PHP kürzen

Nachfolgendes Listing liest einen Text ein und kürzt diesen nach 120 Zeichen. Allerdings werden nicht genau 120 Zeichen ausgegeben, sondern es wird ab der 120. Position nach einem Punkt gesucht (der normalerweise das Satzende darstellt) und dann der vollständige Satz ausgegeben. Auf diese Weise kann man verhindern das der Text mitten im Satz abgeschnitten wird.

$text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.";
 
echo substr( $text, 0, strpos( $text, ".", 120 )+1 );

Diese Methode funktioniert gut, wenn die Texte nicht allzu lang sind. Liest man allerdings komplette News aus einer Datenbank ein, kann der Text schon mal etliche Kilobyte groß sein. Werden viele News von vielen Usern aufgerufen, bzw. ausgelesen, kann das für einen Server schon eine enorme Belastung darstellen.
Der Nachteil am Kürzen mit PHP ist nämlich, dass man immer den kompletten Text, unabhängig von dessen Länge, in den Speicher laden und dort halten muß, was massiv auf die Performance drücken kann. Soll heissen, wenn eine News beispielsweise 8000 Zeichen lang ist, müssen 8000 Zeichen -pro Aufruf- im Speicher gehalten werden, selbst wenn wir nur 200 Zeichen für den Teaser benötigen!


Lange Texte direkt mit MySQL kürzen

Der Vorteil beim Kürzen mit MySQL ist, dass tatsächlich nur die benötigte Anzahl an Zeichen ausgelesen werden. Ist eine News z.B. 6000 Zeichen lang, aber wir benötigen nur 200 Zeichen für einen Teaser, lesen wir tatsächlich nur 200 Zeichen aus. Das ist natürlich erheblich resourceschonender und performanter als die Variante mit PHP. Der Nachteil ist, dass wir hier nicht so gut steuern können wo der Text abgeschnitten wird. So kann es passieren das Texte auch mitten in einem Wort aufhören.

$sql = "SELECT
            IF(LENGTH(`nachricht`) > 200, CONCAT(LEFT(`nachricht`, 197), '...'), `nachricht`) AS teaser
        FROM
            `tabelle`";

Hier wird geprüft ob der Inhalt im Feld nachricht länger ist als 200 Zeichen. Trifft das zu, werden 197 Zeichen ausgelesen und um ... (typischer Hinweis für einen gekürzten Text) erweitert. Ist der Text kürzer als 200 Zeichen, wird die komplette Zeichenkette ausgelesen.


Die Mischung machts

Wie wir an diesen beiden Verfahren gesehen haben, hat jede für sich Vor- und Nachteile. Was liegt also näher als beide Vorteile zu nehmen und sie zu einer Dritten Methode zu kombinieren?!
Wir benutzen also den performanten Weg von MySQL um uns einen Teaser auszulesen und werden Mithilfe von PHP für eine saubere Ausgabe sorgen. Hier zunächst der Code:

<?php
$conid = mysql_connect( 'localhost', 'benutzer', 'passwort' );
mysql_select_db( 'datenbank', $conid );
 
$sql = "SELECT
            IF(LENGTH(`nachricht`) > 250, LEFT(`nachricht`, 300), `nachricht`) as teaser
        FROM
            `tabelle`";
$res = mysql_query( $sql, $conid );
while ($news = mysql_fetch_object( $res ))
{
    echo "<p>" .substr( $news->teaser, 0, strpos( $news->teaser, ".", 180 )+1 ). "</p>";
}
?>

Wir stellen also eine DB-Verbindung her und stellen die Anweisung zusammen. Es wird geprüft ob der Inhalt im Feld nachricht länger als 250 Zeichen ist, in dem Fall lesen wir 300 Zeichen aus, ansonsten die komplette Nachricht. Wir lesen also mehr Text aus als benötigt, da wir so sicher stellen wollen, dass wir auch einen kompletten Satz zum abschliessen erwischen. Das Abfrageergebnis wird gefetcht und in der Schleife hübschen wir dann die Ausgabe auf. Es wird also ab der 180. Position nach einem Punkt gesucht, der das Satzende markiert. Der Teaser wird dann bis zu diesem Punkt ausgegeben und auf diese Art haben wir einen performanten, resourceschonenden Weg gefunden unser Ziel zu erreichen.

Hinweis:
Unter bestimmten Umständen muss man mit der auszulesenden Länge, sowie substr und strpos experimentieren um ein optimales Ergebnis zu erhalten. So kann es passieren, dass Texte im Feld nachricht zu kurz sind und keinen Punkt enthalten, so dass die Suche nach einem Satzende in's Leere läuft. In dem Fall spuckt PHP eine Fehlermeldung aus, dass ein Offset nicht gefunden wurde!