Teaser Text

Will man aus einem langen Text einen Teasertext (Shorttext oder manche sagen auch Anreisser dazu) generieren, kann man z.B. nach 160 Zeichen einfach den Rest wegschneiden und … anhängen. Wenn das aber mitten in einem Wort passiert, ist das eher unschön.

Update!!!

Soeben habe ich ein CSS-Property gesehen, welches diese PHP-Funktion bei diesen Anwendungfall überflüssig macht. Besten Dank an „Unleashed Design„.
Das CSS-Property line-clamp, erfüllt mit den dazugehörigen Attributen alle Anforderungen an einen Teasertext. Sogar die drei Punkte werden automatisch gesetzt bzw. entfernt.

Der textWrapper dient nur zum bestimmen der Größe und kann in diesem Beispiel in der Größe verändert werden.

.textWrapper {
	width: 200px;
	border: 1px solid rgb(75, 75, 75);
	margin: auto;
	padding: 25px;
	resize: both;
	overflow: hidden;
	.line-clamp {
		display: -webkit-box;
		-webkit-line-clamp: 3;
		overflow: hidden;
		-webkit-box-orient: vertical;
	}
}

Und so ging es mit PHP.

$longtext = 'Will man aus einem langen Text einen Teasertext (Shorttext oder manche sagen auch Anreisser dazu) generieren, kann man z.B. nach 160 Zeichen einfach den Rest, wegschneiden und ... anhängen. Wenn das aber mitten in einem Wort passiert, ist das eher unschön.';

$delimiters = array(",",".","|",":"," ","-","/");

$teaser = getTeaserText($delimiters, $longtext, 160);

$badTeaser = substr($longtext, 0, 160);

echo '|'.$badTeaser.'|';
echo '<br />';
echo '|'.$teaser[0].'|';

Erzeugt folgende Ausgabe:

|Will man aus einem langen Text einen Teasertext (Shorttext oder manche sagen auch Anreisser dazu) generieren, kann man z.B. nach 160 Zeichen einfach den Rest, w|

|Will man aus einem langen Text einen Teasertext (Shorttext oder manche sagen auch Anreisser dazu) generieren, kann man z.B. nach 160 Zeichen einfach den Rest, |

Hier die Funktionen dazu:

function getTeaserText($delimiters, $string, $offset) {
	$parts = array();
	$nextPos = strposNext($string, $delimiters, $offset);
	$prevPos = strposPrev(substr($string, 0, $offset), $delimiters);
	$nearbyPrev = $offset - $prevPos;
	$nearbyNext = $nextPos - $offset;
	if($nearbyPrev < $nearbyNext){
		$parts[] = substr($string, 0, $prevPos + 1);
		$parts[] = substr($string, $prevPos + 1);
	}else{
		$parts[] = substr($string, 0, $nextPos + 1);
		$parts[] = substr($string, $nextPos + 1);
	}
	return $parts;
}

function strposPrev($haystack, $needles = array()) {
	$chr = array();
	foreach ($needles as $needle) {
		$first = strripos($haystack, $needle);
		if ($first !== false) {
			$chr[$needle] = $first;
		}
	}
	if (empty($chr)) {
		return false;
	}
	return max($chr);
}

function strposNext($haystack, $needles = array(), $offset = 0) {
	$chr = array();
	foreach ($needles as $needle) {
		$first = strpos($haystack, $needle, $offset);
		if ($first !== false) {
			$chr[$needle] = $first;
		}
	}
	if (empty($chr)) {
		return false;
	}
	return min($chr);
}
Veröffentlicht am
Kategorisiert in php