Vorschau Text mit PHP

Möchte man einen kurzen Vorschautext in PHP erstellen, der einen Anriss des effektiven Textes zeigt, so wird man wohl oft die einfachste Variante gewählt haben, und einfach nach einer Anzahl definierten Zeichen abgeschnitten haben. Dies generiert jedoch ein unschönes Ergebnis, wenn man eine proportionale Schrift verwendet. Sämtliche Text haben markant unterschiedliche Längen wie auf diesem Bild gezeigt wird:

text-trimming

Dieser Artikel zeigt einen einfachen Ansatz, diese Problematik etwas eleganter zu lösen!

Textlänge messen

PHP bietet verschiedene Methoden um die Länge eines Textes zu messen. Zum Beispiel die Methode ImageFontWidth welche die Länge der PHP internen Schriften einfach und gut messen kann. Möchte man ein einfaches Captcha erstellen, das die internen Schriften verwendet, ist diese Methode sicherlich eine gute Wahl.

Allerdings gibt’s noch eine andere Methode, welche die komplette “Bounding Box” errechnet. Sie lautet imagettfbbox. Der Rückgabe-Wert ist eine Array welches sämtliche Werte für die “Bounding Box” enthält.

Die Methode

Wie zu Beginn des Artikels gezeigt, wollte ich eine Methode die den Text kürzt und am Ende einen weiteren Text (in diesem Fall “…”) anhängt um zu zeigen, dass der Text nicht vollständig ist.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function trim_by_width($text,$width,$font_file,$font_size=7,$append_string = '...')
{
	$append_string_box = imagettfbbox($font_size,0,$font_file,$append_string);
	$append_string_width = $append_string_box[2];
 
	$str_len = strlen($text);
	for ($i = 0; $i<=$str_len; $i++)
	{
		$trimmed_text = substr($text,0,$i);
		$bounding_box = imagettfbbox($font_size,0,$font_file,$trimmed_text);
		$trimmed_text_width = $bounding_box[2];
		if ($trimmed_text_width + $append_string_width > $width && $i > 0)
		{
			$str_to_return = substr($trimmed_text,0,strlen($trimmed_text)-1);
			if ($trimmed_text_width != $str_len)
			{
				$str_to_return .= $append_string;
			}
			return $str_to_return;
		}
	}
	return $text;
}
$trimmed_text = trim_by_width($text, $width, $font_file, $font_size, $append_string='...');

$text:
Der Text der zu kürzen

$width:
Die maximale Länge des Textes in Pixel!

$font_file:
Die True Type Schriftendatei

$font_size:
Die Schriftgrösse. Bitte beachten Sie, dass die Einheiten je nach GD Version anders sind. GD1 verwendet Pixel, GD2 hingegen Punkte./code>

$append_string:
Ein optionaler String welcher bei gekürzten Texten angehängt wird. Standardmässig "..."

Beispiel

Sie können die Methode nach folgendem Schema aufrufen:

echo trim_by_width('this is a long text',55,dirname(__FILE__) . '/verdana.ttf',8);

Das Script geht davon aus, dass sich die Datei verdana.ttf im gleichen Verzeichnis wie das PHP Script befindet. Anschliessend wird der Text nach 55 Pixel gekürzt und ausgegeben.

Fertig!




4 Comments

Thanks, you’re right, text-overflow is great if you need SEO, but sometimes if you have a huge list with a ton of elements you might want to keep things short. Or imagine if you wanted to create a plain text mail, text-overflow won’t work then…
At the end I’d recommend to keep both solutions in your pockets!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *