PHP: Fundstellen im Kontext anzeigen
Ich habe heute die Suche auf dieser Website etwas verbessert – in den Suchergebnissen wird nicht mehr nur der Anfang des jeweiligen Eintrags angezeigt, sondern ein Ausschnitt des Eintrags mit dem Suchbegriff im Kontext.
Dafür reicht eine kleine PHP-Funktion:
function fundstelle($text, $suchbegriff) {
$textlaenge = 140;
$pos = strpos(strtolower($text), strtolower($suchbegriff));
$pos = $pos - ($textlaenge / 2);
if ($pos < 0) {
$pos = 0;
}
$text = substr($text, $pos, $textlaenge);
if (strlen($text) == $textlaenge) {
$text = strstr(strrev($text), " ");
$text = strrev($text);
$text .= "...";
}
if ($pos != 0) {
$text = strstr($text, " ");
$text = "...".$text;
}
return $text;
}
Im ersten Teil wird angegeben, wie lang die angezeigte Fundstelle höchstens sein darf und die Position für das erste Vorkommen im Text ermittelt.
Dann wird der $pos Zeiger um die Hälfte der Textlänge zurück- bzw. auf 0 gesetzt, wenn das Ergebnis < 0 sein sollte.
Als nächstes werden so viele Zeichen, wie in $textlaenge angegeben, aus dem Text extrahiert.
Die nächsten zwei Teile entfernen abgeschnittene Wortteile am Ende bzw. am Anfang der Fundstelle und hängen, falls es sich nicht um das Ende des gesamten Eintrags handelt, drei Punkte "..." an, bzw. stellen sie davor, wenn es sich nicht um den Anfang des Eintrags handelt.
Ähnliche Beiträge:
Co-Designer für Dingbats-Font gesucht Macht nix
Kommentare:
Bei den Kommentaren handelt es sich um fremde Inhalte, die sich „esse est percipi“ nicht zueigen macht. Verantwortlich für den Inhalt eines Kommentars ist der jeweilige Verfasser.
Hübsch. Ich dachte, das Gleiche in einen Regex quetschen zu können. Aber die oben gezeigte Lösung ist allemal hübscher und mächtiger. Falls es trotzdem interessiert:
function fundstelle($text, $suche, $laenge = 140) {$p = preg_quote($suche, "/");$n = round($laenge / 2);preg_match("/.{0,$n}$p.{0,$n}/is", $text, $m);return "... " . $m[ 0] . " ...";}Danke ;-) Hier ist übrigens noch eine Verbesserung bzw. Ergänzung, die $pos um die gesamte $textlaenge zurücksetzt, falls die Fundstelle ganz am Ende des durchsuchten Textes liegt:
if ($pos < 0) {
$pos = 0;
} else if (($pos + $textlaenge) > strlen($text)) {
$pos = (strlen($text) - $textlaenge) + 1;
}
Kommentar schreiben:
FAQ (Häufig gestellte Fragen)
Kommentare:
- Michael Preidel zu Pasta dell’Orto
- Stefan zu Pasta dell’Orto
- Michael Preidel zu CookieCrumble Testflight jetzt auch für macOS
- Götz zu CookieCrumble Testflight jetzt auch für macOS
- Michael Preidel zu Harbor – Sicherer Hafen [Testflight]
- Henning zu Harbor – Sicherer Hafen [Testflight]
Schlagwörter

