Zur Boardunity Forenstartseite

Zurück   Boardunity & Video Forum » Technik » Programmierung und Datenbanken

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1  
Alt 10.09.2004, 13:33
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 888

Suchergebnisse "googlifizieren"


Gesucht und nicht gefunden: Ansätze wie man Suchergebnisse so darstellt wie das in Suchmaschinen so üblich ist. Also in der Ergebnisliste eine Einleitung der gefundenen Seite darstellen und hierbei jeweils ein bisschen Text vor und nach dem Treffer aus dem Text anzeigen.

Da es hierzu in PHP nicht viel zu finden gab (das einzige war dieses Tutorial welches aber eher einem Witz ähnelt) habe ich eine Funktion geschrieben die auch von anderen nutzbar ist. Möglicherweise besteht daran ja Interesse. Der Code erhebt keinen Anspruch auf Perfektion oder Fehlerlosigkeit, Benutzung auf eigene Veranwortung. Die Lizenz ist auch einfach: benutz ihn wie du willst für was du willst.

PHP-Code:
<?PHP
/**
 * Makes a search teaser like the ones displayed in google
 * search results.
 *
 * @author Johannes Klose <[email protected]>
 * @param  string $text          Text which should be "googlified"
 * @param  mixed  $query         The search query, either as array of search words or query string
 * @param  string $highlight     Highlight template with a %s spacer for the search word
 * @param  int    $teaserLength  Maximum length of the teaser (defaults to 300)
 * @param  int    $minGap        Minimum of characters as space between two extracts
 * @param  int    $minWordLength Minimum length of a search word (defaults to 3)
 * @return mixed                 Googlified text as string or boolean false on failure
 **/
function googlifyMe($text$query$highlight$teaserLength 400$minGap 5$minWordLength 3)
{
        if(!
is_array($query)) {
                
$query    preg_replace('/[^\w\s]/',                            ' '$query);
                
$query    preg_replace('/\b\w{0,'.($minWordLength 1).'}\b/'' '$query);
                
$query    preg_replace('/\s/',                                 ' '$query);
                
$query    preg_replace('/\s{2,}/',                             ' '$query);
                
$words    array_unique(explode(' 'trim($query)));
                
$numWords count($words);
        } else {
                
$words    $query;
                
$numWords count($words);
        }

        if(
$numWords <= 0) {
                return 
false;
        }

        
$pre      round(((($teaserLength $numWords) / 2) - $minGap), 0);
        
$pre      $pre $pre;
        
$searchHi '/('.join('|'$words).')/ie';
        
$search   join('|'$words);
        
$search   '/\b(.{0,'.$pre.'})('.$search.')(.{0,'.$pre.'})\b.{'.$minGap.'}/si';
        
$result   '';

        
preg_match_all($search$text$matches);
        
$wordsDone    = array();
        
$countMatches count($matches[0]);

        for(
$i 0$i $countMatches$i++)
        {
                
$preWord  $matches[1][$i];
                
$postWord $matches[3][$i];
                
$word     $matches[2][$i];

                if(isset(
$wordsDone[strtolower($word)])) {
                        continue;
                } else {
                        
$wordsDone[strtolower($word)] = 1;
                }

                
$tmp      ' ... '.$preWord.$word.$postWord;
                
$result  .= preg_replace($searchHi'sprintf($highlight, stripslashes("\1"))'$tmp);
        }

        return 
trim($result).' ...';
}
?>
Diese Funktion nimmt einen Text, Suchwörter und ein Highlightemplate und liefert eine Zusammenfassung im Suchmaschinenstil zurück.

Die Parameter im einzelnen:

$text - der Text der Zusammengefasst werden soll (logisch)
$query - entweder ein Suchstring oder ein Array mit Suchwörtern. Wenn es ein String ist wird er automatisch geparsed und in ein Array mit Suchwörtern aufgespalten.
$highlight - eine Vorlage zum hervorheben der Suchwörter. Die Vorlage wird via sprintf() bearbeitet. Das bedeutet das %s durch das hervorzuhebende Suchwort ersetzt wird.
$teaserLength - Richtwert für die maximale Länge der Zusammenfassung. Kann gerinfügig unter- und überschritten werden.
$minGap - minimum an Zeichen die zwischen zwei extrahierten Textstellen im Text sein müssen
$minWordLength - die minimale Suchwortlänge, spielt nur eine Rolle wenn $query ein String ist

Beispiel:
Code:
$text = 'eigentlich ist die postgresql ja ganz nett, aber mysql ist ja auch nicht zu verachten. php macht aber vorallem in verbindung mit einem apache webserver spass. man kann das zwar auch im cgi modus betreiben, aber das macht meist eher weniger spass. wie auch immer ist dies ein ganz dämlicher blindtext und ihm sollte nicht mehr beachtung geschenkt werden als unbedingt notwändig. und hier ist jetzt auch schon wieder schluss.';
$query = 'php mysql apache blindtext';
$highlight = '<b>%s</b>';

echo googlifyMe($text, $query, $highlight);
Ausgabe:
Zitat:
... eigentlich ist die postgresql ja ganz nett, aber mysql ist ja auch nicht zu verachten. php macht aber ... in verbindung mit einem apache webserver spass. man kann das zwar auch im cgi ... . wie auch immer ist dies ein ganz dämlicher blindtext und ihm sollte nicht mehr beachtung geschenkt ...
Verbesserungsvorschläge, Bugreports und sonstiges Feedback sind natürlich herzlich Willkommen
__________________
Johannes Klose
Calitrix Wiki - Wiki auf Basis von PHP und MySQL

Geändert von exe (10.09.2004 um 19:43 Uhr). Grund: noch zwei kleine bugsh behoben
  #2  
Alt 10.09.2004, 13:56
Mitglied
 
Registriert seit: 07.2002
Beiträge: 357
Interessant vielleicht auch der Code des TextSearchImproved-Mod von Wikka: http://wikka.jsnx.com/Mod014fTextSearchImproved

  #3  
Alt 10.09.2004, 17:25
Benutzerbild von MaMo
Viscacha Coder
 
Registriert seit: 09.2003
Beiträge: 812
Hey danke Exe, genau sowas hab ich für mein Board gesucht *einbau*

MfG MaMo

__________________
Forensoftware mit integriertem CMS: Viscacha 0.8!
  #4  
Alt 10.09.2004, 19:06
Benutzerbild von codethief
Visionär
 
Registriert seit: 09.2003
Beiträge: 811
Hey danke exe.
Das bau ich auch in mein Forum ein.
Off-Topic:
Benutzt du eigentlich auch das Zend Studio? Die Kommentare sehen so danach aus.

  #5  
Alt 10.09.2004, 19:49
Benutzerbild von exe
exe exe ist offline
titellos
 
Registriert seit: 07.2003
Ort: München
Beiträge: 888
Ich hab eben noch zwei kleine Bugs behoben die unter Umständen die Zusammenfassung stark in die Länge ziehen oder stark verkürzen. Wenn ihr die Funktion schon eingebaut habt solltet ihr sie nochmal mit der Version im Eingangsbeitrag ersetzen.

Zitat:
Zitat von codethief
Off-Topic:
Benutzt du eigentlich auch das Zend Studio? Die Kommentare sehen so danach aus.
Off-Topic:
Nicht mehr. Ich habe es früher benutzt, aber auf Dauer war die Java-Oberfläche nicht so praktisch auf meiner uralten 450Mhz Gurke Ich benutze im moment KDevelop, was eigentlich auch ganz brauchbar ist. Die Kommentare sind übrigens nicht "Zend Studio" sondern phpdoc, nachzulesen unter http://www.phpdoc.org

__________________
Johannes Klose
Calitrix Wiki - Wiki auf Basis von PHP und MySQL
  #6  
Alt 10.09.2004, 20:29
Mitglied
 
Registriert seit: 10.2003
Ort: Bottrop
Beiträge: 779
Ich bedanke mich auch mal. Hab zwar aktuell keine Verwendung dafür, aber wie ich mich kenne werd ich das bestimmt gebrauchen können.

__________________
Patrick Gotthardt
Patrick Gotthardt on Software
  #7  
Alt 10.09.2004, 22:36
Benutzerbild von Philipp Gérard
Zeitdenken
 
Registriert seit: 09.2003
Ort: Wien
Beiträge: 832
hübsch, aber das zieht doch ziemlich an der Performance bei einigen Suchergebnissen...

__________________
Philipp Gérard
Gewöhnliche Menschen denken nur daran, wie sie ihre Zeit verbringen. Ein intelligenter Mensch versucht sie zu nützen. - Arthur Schopenhauer
  #8  
Alt 11.09.2004, 11:00
Benutzerbild von codethief
Visionär
 
Registriert seit: 09.2003
Beiträge: 811
@exe: Das war mir noch nicht bekannt. Danke dir!

Antwort


Stichworte
-


Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
Gehe zu






1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25