mic: Suchergebnisse hervorheben

hi,
ich habe eine kleine suche in php und mysql programmiert.

da sucht man beispielsweise nache
 +auto +schnell -teuer
die treffer sind auch alle korrekt, jetzt möchte ich aber dem user auch sagen, warum die treffer krrekt sind. wie bei google oder anderen suchmaschinen sollen dann ein paar wörter vor und nach dem jeweiligen suchwort ausgeben werden, wobei selbiges hervorgehoben wird.

seit über einer woche sitze ich an einer lösung und kriegs eunfach nicht hin ;'-(((

kennt jemand ne lösung, hat erfahrungen und weiß ein tutorial.

außerdem:

wie kann man strpos() groß-und kleinschreibung-sensituve machen? Das ist einer meiner hauptptrobleme...

für hilfe wäre ich echt dankbar!

der verzweifelter mic

  1. Huhu mic

    seit über einer woche sitze ich an einer lösung und kriegs eunfach nicht hin ;'-(((

    Was hast Du denn in dieser Woche gemacht?
    (war da nicht auch irgendwann Weihnachten oder hast Du das deswegen verpasst?)
    Naja, was auch immer es war, ein Blick in die Dokumentation war wohl nicht dabei, oder?

    wie kann man strpos() groß-und kleinschreibung-sensituve machen? Das ist einer meiner hauptptrobleme...

    Mit "sensituve" meinst Du vermutlich "insensitive", da strpos doch bereits "case-sensitive" ist.

    http://php.net/manual/en/function.stripos.php

    http://php.net/manual/en/ref.strings.php

    Für Dein Vorhaben wirst Du vermutlich nicht ohne reguläre Ausdrücke auskommen.
    Dazu gibt es diverse Tutorials, google halt mal

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. hi again,

      seit über einer woche sitze ich an einer lösung und kriegs eunfach nicht hin ;'-(((

      Was hast Du denn in dieser Woche gemacht?
      (war da nicht auch irgendwann Weihnachten oder hast Du das deswegen verpasst?)
      Naja, was auch immer es war, ein Blick in die Dokumentation war wohl nicht dabei, oder?

      DOCH... aber (PHP 5 CVS only)-Funktionen, wie stripos bringen mir gar nichts! 1. hane ich php 5 net und 2. dauerts noch ewig bis mein provider diese version aufspielen wird.

      wie kann man strpos() groß-und kleinschreibung-sensituve machen? Das ist einer meiner hauptptrobleme...

      Mit "sensituve" meinst Du vermutlich "insensitive", da strpos doch bereits "case-sensitive" ist.

      hahst natürlich recht. meine insensitive.

      Für Dein Vorhaben wirst Du vermutlich nicht ohne reguläre Ausdrücke auskommen.

      da bin ich leider zu doof für, trotzdem habe ichs auch damit versucht. aber eine position mit regex zu finden... geht dass?

      wie machen andere suchmaschinen denn das?

      sanke

      mic

      1. Huhu mic

        ... aber (PHP 5 CVS only)-Funktionen, wie stripos bringen mir gar nichts!

        Ups, das hatte ich übersehen, dass die Funktion erst ab Version 5
        zur Verfügung steht. Schade, aber die regulären Ausdrücke sind ja auch viel schöner ;-)

        da bin ich leider zu doof für, trotzdem habe ichs auch damit versucht. aber eine position mit regex zu finden... geht dass?

        Deine "Aufgabe" lässt sich ja in zwei Schritte unterteilen:

        1. Finde aus einem gegeben Text einen Abschnitt der den Suchbegriff enthält
        2. hebe den Suchbegriff hervor

        Wobei 2. ja einfach umzusetzten ist z.B. mit str_replace, oder preg_replace.

        Die erste Teilaufgabe lässt sich mit preg_match lösen.

        Das ist schon etwas kniffliger wenn Du noch nie mit regexp gearbeitet hast.

        Viele Grüße

        lulu

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. hi,

          Deine "Aufgabe" lässt sich ja in zwei Schritte unterteilen:

          1. Finde aus einem gegeben Text einen Abschnitt der den Suchbegriff enthält
          2. hebe den Suchbegriff hervor

          Wobei 2. ja einfach umzusetzten ist z.B. mit str_replace, oder preg_replace.

          Die erste Teilaufgabe lässt sich mit preg_match lösen.

          Das ist schon etwas kniffliger wenn Du noch nie mit regexp gearbeitet hast.

          das hervorheben ist kkein problem. die eigentliche schwierigkeit liegt einfach darin die position des sucbegriffes im text herrauszufinden, um anschließend mit substr() zB 50 buchstaben davor und 50 danch auszugeben. schließlich soll bei der trefferliste unter dem titel auch ein kleiner auszug (bzw. mehrere bei mehreren suchwörtern) vom text der gefunden wurde zu sehen sein. in google-manier:

          suche nach +auto +schneller

          Ferrari 40 in rot jetzt bei ebay
          ...besonders Hansi, dessen <b>Auto</b> langsamer als ein Trabbi war..der Wagen wat in den 80ern <b>schneller</b> als die meisten anderen...

          you know that i mean?

          thx

          mic

          1. Huhu mic

            hier mal eine Lösung für nur einen Suchbegriff.
            Das sollte dem was Du suchst schon ziemlich nahe kommen.
            Schau es Dir halt mal an.

            <?php
            /**
            * suchergebnisse
            */

            $example = <<< EOT
            Um die Treffer bei einer Suchanfrage kenntlich zu machen, wird häufig
            ein Teilabschnitt des Textes angezeigt welcher den oder die Suchbegriffe enthält.
            Die gefundenen Begriffe werden dabei zusätzlich hervorgehoben.
            Dies ist ein Beispiel dafür.
            EOT;

            function mark_hits($text, $search)
            {
                $w = preg_quote($search);
                $n = 40;
                $dummy = preg_match("#\b.{0,$n}$w.{0,$n}\b#si",$text, $match);
                if ($dummy) {
                    $result = '... '.preg_replace("#($w)#i", "<strong>\1</strong>",$match[0]).' ...';
                } else {
                    $result = "Die Suche nach <em>$search</em> lieferte keine Treffer.";
                }
                return $result;
            }

            echo $example;
            echo '<hr>';
            echo mark_hits($example, 'begriff');
            echo '<hr>';
            echo mark_hits($example, 'hits');

            ?>

            Gute Nacht

            lulu

            --
            bythewaythewebsuxgoofflineandenjoytheday
            1. vielen dank für die zeit die du investiert hast!

              leider ist alles schrecklich!!! ;-)

              zumindest mit dieser hervorheben sache, weill ja oft nach mehreren begriffen gesucht wird und der text um die suchbegriffe herum sich manmchal überschneidet etc.

              jedenfalls gehe ich die sache jetzt nochmal neu und ganz anders an.

              aber nochmals, besonders an dich lulu,  vielen vielen dank!

              mic

              1. Huhu mic

                zumindest mit dieser hervorheben sache, weill ja oft nach mehreren begriffen gesucht wird und der text um die suchbegriffe herum sich manmchal überschneidet etc.

                Ja, habe eben nochmal geguckt wie google das macht.
                Es werden da anscheinend maximal drei Ausschnitte (mit Treffer) aus der Seite angezeigt.

                Vor einem Treffer werden rund 50 Zeichen angezeigt (unter Berücksichtigung der Wortgrenzen).
                Nach einem Treffer zwei Worte, wobei zweibuchstabige Wörter nicht mitzählen.
                Das nenne ich jetzt mal Trefferzone.
                Wenn sich Trefferzonen überschneiden werden diese bei der Ausgabe zusammengefasst.

                So habe ich das jedenfalls mit der "versuch-macht-kluch-Methode" ermittelt.

                Das Problem ist nicht uninteressant, werde auch mal versuchen
                etwas in der Richtung zusammenzuschrauben.

                Vermutlich ist es hilfreich vorher die Regeln (in natürlicher Sprache ) festzulegen, wie mit den (Mehrfach)- Treffern umgegangen werden soll.
                Und/ oder man legt einen Beispieltext zu Grunde der ein paar knifflige Konstellationen enthält und markiert erstmal die Stellen wie sie von der Suchfunktion ausgegeben werden sollen.

                Wenn man dann noch die einzelnen Suchbegriffe unterschiedlich gewichtet, oder z.B. Trefferzonen mit mehreren Hits nach Zahl der Treffer entsprechend bewertet, HTML-Tags berücksichtigt etc. wird es langsam interessant ;-)

                (Allerdings braucht man das evtl. auch gar nicht)

                Viele Grüße

                lulu

                --
                bythewaythewebsuxgoofflineandenjoytheday
                1. Huhu

                  Das Problem ist nicht uninteressant, werde auch mal versuchen
                  etwas in der Richtung zusammenzuschrauben.

                  mein vorläufiges Ergebnis findest Du hier
                  http://www.maledivas.de/self/markit.php

                  wie weit bist Du gekommen?

                  Viele Grüße

                  lulu

                  --
                  bythewaythewebsuxgoofflineandenjoytheday
                  1. interessant ist das prblem auf jeden fall.

                    hast ja was schickes auf die beine gestellt. ist ja eigentlich astrein so...
                    Das einzige, was mir jetzt aufgefallen ist, ist das er 'paul' zwar markiert, aber trotzdem "Die Suche nach Paul lieferte keine Treffer." sagt. liegt villeicht am ) hinter Paul oder weils das letzt Wort ist...

                    ich habe die sache jtzt ohne zeitzonen programmiert, weil mir das jetzt zuviel action war, also wenns überschn eidungen gibt, hab ich halt pech gehabt...

                    vielleicht kannst du mir ja mal den posten. wäre nett.

                    wenn mein verööfentlichungsreif, also ohne zig echos und prints, kann ich ihn dir ja auch mal senden.

                    soweit und nochmals thx

                    mic

                    ps: schicke band ;-)

  2. Hi mic,

    ich habe eine kleine suche in php und mysql programmiert.

    Mmh Du hast also eine Suche in MySQl programiert.

    Ja die Such durchsucht eine DB?
    Und die DB ist MySQL?
    Richtig?
    Dann verrate doch mal was Du denn bisher anzeigen läst?
    Vielleicht läst Du den kompletten Datensatz anzeigen?

    Wie Du den Fett kriegst ist ja eigentlich logisch oder?
    Du hast ja die Variable, also kannst Du den String durchsuchen und dann mittels str_replace () ersetzen.
    ISt ja nicht so kompliziert oder?

    naja gut vielleicht hilfts ja ein bischen...
    ToMIRL