Ankündigung

Einklappen
Keine Ankündigung bisher.

Suchfunktion-Resultat bei Leerzeichen beenden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Suchfunktion-Resultat bei Leerzeichen beenden

    Hallo zusammen
    ich hab ein Problem, dass sicher schon in diesem Forum gelöst wurde, aber wenn ich die Suchfunktion benutze, bekomme ich zu viele Resultate....

    Ich arbeite an einer Suchfunktion, die die Texte meiner Website, die in einer MySQL-DB gespeichert sind, durchsucht und bei Treffern ausgibt.....

    Das ist der Quelltext:

    Code:
    $reintexta = strip_tags($rowv['Text']);
    if(strpos($reintexta,$Suchbegriff,1))
    {
    $position = strpos($reintexta,$Suchbegriff,1);
    $start = $position - 100;
    if($start<0) $start = 0;
    $ende = $position + 100;
    $reintext = eregi_replace($Suchbegriff,'<font color="#ff0000">'.$Suchbegriff.'</font>',$reintexta);
    $ausgabe = substr($reintext,$start,200);
    }
    Das funzt auch zu 95% der Fälle, aber trifft es der Zufall so, dass der Suchstring mehrmals im durchsuchten Text vorkommt und genau dort wird die Ausgabe abgebrochen, so wird der Rest der Suche nicht mehr ausgegeben....
    Zudem hört so die Ausgabe einfach mitten im Wort auf, was nicht sehr schön aussieht....
    Wie kann ich es machen, dass er das letze angefangen Wort noch komplett ausgibt....habe es mit explode() probiert und glaube auch, dass das möglich wäre, aber ich bin einfach zu blöd um das irgendwie hinzukriegen mit dem Code oben....

    Deshalb brauch ich eure Hilfe

    Danke im Voraus....

    Gruss

  • #2
    Grübel, Grübel ...
    um zumindest das letzte Wort noch komplett auszugeben, mußt Du das nächste Leerzeichen nach $ende finden:

    [...]
    $ende = $position + 100; // < wie gehabt
    $ende = strpos(" ",$Suchbegriff, $ende); // " " oder chr(32)
    [...]
    das sollte dann Position des nächste Leerzeichens sein.
    (Achtung Sonderfällen berücksichtigen: z.B. erstes $ende ist schon Leerzeichen ...krieg ich im Kopf im Moment nicht klar...)

    Kommentar


    • #3
      hallo??
      wozu gibt es bitte das tutorial-forum??

      http://www.phpfriend.de/ftopic15352.html
      [b][url=http://www.benjamin-klaile.de]privater Blog[/url][/b]

      Kommentar


      • #4
        Also ich habs mal versucht, aber wenn ich das einfach so einfüge, bekomme ich ne Fehlermeldung und er gibt mir bei jedem Treffer den ganzen Text aus.....

        Hab das ganze mal ein bisschen geändert:

        Code:
        $reintexta = strip_tags($rowv['Text']);
        if(strpos($reintexta,$Suchbegriff,1)) {
        $position = strpos($reintexta,$Suchbegriff,1);
        $start = $position - 100;
        if($start<0) $start = 0;
        $ende = $position + 100;
        $diff = $ende-$start-1;
        $reintext = eregi_replace($Suchbegriff,$Suchbegriff,$reintexta);
        $ausgabe = substr($reintext,$start,$diff);
        Die Variabel $diff ist dazugekommen....

        Komischerweise stimmt es jetzt zu 90%, dass es dort aufhört wo es sollte, obwohl ich gar kein Leerzeichen ermittle....

        Vielleicht geht es mit strpos(" ",....) nicht.....

        Ich versuchs mal weiter und hoffe auf eure Ideen

        Gruss

        Kommentar


        • #5
          Zitat von Montellese
          und hoffe auf eure Ideen
          was soll ich dazu sagen ..

          vielleicht das hier ..
          http://www.dclp-faq.de/q/q-mysql-volltextsuche.html

          [b][url=http://www.benjamin-klaile.de]privater Blog[/url][/b]

          Kommentar


          • #6
            @Ben: Meinst du ich bin zu blöd um eine MySQL-Db zu durchsuchen?

            Code:
            $sql = "SELECT * FROM texte WHERE Begriff LIKE '%".$Suchbegriff."%'";
            $result = mysql_query($sql);
            Mein Problem ist nicht das durchsuchen sondern die korrekte Ausgabe, die bei dem Anfang eines Wortes beginnt und bei dem Ende eines Wortes aufhört und dazwischen soll sich der Suchbegriff befinden....

            Das kommt wohl überhaupt nicht in deinem sogenannten Tutorial (das in meinen Augen zu wenig kommentiert ist für ein Tut....ich verstehs schon, aber Anfänger für die Tuts geschrieben sind, raffens vielleicht ned) vor....

            EDIT: Zum zweiten Link.....die Grundlage ist nicht schlecht, nur hat es einen entscheidenden Haken....wer "Bauer" als Suchbegriff eingibt, findet "Bauernhof" nicht, aber genau deshalb hab ich ne Suchmaschine, weil viele Besucher nie den ganzen Namen oder so wissen....

            Gruss

            Kommentar


            • #7
              Zitat von Montellese
              Meinst du ich bin zu blöd um eine MySQL-Db zu durchsuchen?
              ist diese vorstellung sooo abwägig?
              weißt du eigentlich wie viele leute hier nicht einmal wissen was PHP und MySQL überhaupt sind??

              aber was sollen wir darüber diskutieren. trägt zur lösungsfindung ja eher nicht bei.

              Zitat von Montellese
              in deinem sogenannten Tutorial
              ist nicht meins, wie man ganz easy lesen kann
              konkrete verbesserungsvorschläge bitte an tobias.


              Zitat von Montellese
              Mein Problem ist nicht das durchsuchen sondern die korrekte Ausgabe, die bei dem Anfang eines Wortes beginnt und bei dem Ende eines Wortes aufhört und dazwischen soll sich der Suchbegriff befinden....
              so wie du das beschreibst .. wird nur ein wort ausgegeben .. aber das ist doch nicht der fall oder?

              ich mach mal ein bsp.
              du hast folgenden text als ergebnis erhalten .. also da ist dann irgendwo der suchbegriff drin ..
              Code:
              $text = "Was ein achso toller Text";
              das suchwort ist jetzt "toller" .. sehr einfallsreich ..

              nunja .. wenn du jetzt nur das eine wort ausgegeben haben möchtest .
              ..
              Code:
              	$text = "Dies ist ein achso toller Text";
              	
              	$searched = "toller";
              	
              	$_text = explode(" ", $text);
              	
              	for ( $i = 0; $i<count($_text); $i++ )
              	{
              	    if ( strcmp($searched,$_text[$i]) == 0 )
              	    {
              	        echo $_text[$i];
              		}
              	} # END OF FOR
              aber das würdest du ja sicherlich hinbekommen .. demnach willst du das wort davor oder danach noch mitausgeben lassen??

              bitte nähere infos.
              sorry ... aber dein bisschen code ist so unstrukturiert .. ich versteh nicht was da geschehen soll.

              also sag einfach kurz, was du im endeffekt haben willst .. und weiter geht es ..

              grüße ben ..

              EDIT:
              EDIT: Zum zweiten Link.....die Grundlage ist nicht schlecht, nur hat es einen entscheidenden Haken....wer "Bauer" als Suchbegriff eingibt, findet "Bauernhof" nicht, aber genau deshalb hab ich ne Suchmaschine, weil viele Besucher nie den ganzen Namen oder so wissen....
              hab ich nicht mehr lesen können ..

              heißt also, dass du doch nur das eine wort ausgeben willst .. aber eben bauer wie bauernhof ... und kuhbauer??

              richtig verstanden?
              [b][url=http://www.benjamin-klaile.de]privater Blog[/url][/b]

              Kommentar


              • #8
                so dann?
                Code:
                <?php
                
                	$text = "Dies ist ein achso toller Text";
                	
                	$searched = "toll";
                	
                	$text = strstr($text, $searched);
                	$pos = strpos($text, " ");
                	$text = substr($text,0,$pos);
                	
                	echo $text;
                
                ?>
                [b][url=http://www.benjamin-klaile.de]privater Blog[/url][/b]

                Kommentar


                • #9
                  OK, mit den Leuten mit 0 Ahnung hast du recht, aber an meiner Beitragszahl solltest du sehen, dass ich hier ned neu bin und nicht selten hab ich Leuten im PHP-Profi Board oder unter MySQL geholfen, aber wie du sagt, hat nix mit dem Thema zu tun....

                  Dieses Script für das eine Wort hätte ich auch hingekriegt da hast du recht....

                  Also nomal was ich will:

                  Ich habe in MySQL an die 160 Texte, die mit einem Titel und einem Text(in HTML) gespeichert sind....
                  Das Script soll die Texte (nicht die Titel, das funtz ganz schön) in der DB durchsuchen und dann die ausgeben, wo der Suchbegriff vorkommt....
                  Dazu sollen etwa 5-6 Wörter vor dem Suchbegriff und 5-6 Wörter nach dem Suchbegriff ausgegeben werden, aber die Anzahl kommt ned so drauf an, man soll einfach ganz kurz den groben Kontext mitbekommen....
                  Deshalb hab ich da

                  Code:
                  $start = $position - 100;
                  Die 100 hab ich einfach mal so genommen.....

                  Klarer Ben, oder noch genauere Ausführung?

                  Zum Code (hab Kommentare beigefügt):

                  Code:
                  $reintexta = strip_tags($rowv['Text']); # Tags entfernen, dass die ned durchsucht werden
                  
                  if(strpos($reintexta,$Suchbegriff,1)) { #nach Suchbegriff suchen
                  
                  $position = strpos($reintexta,$Suchbegriff,1); #Position des Suchbegriffes bestimmen
                  
                  $start = $position - 100; #Start abhängig von $position bestimmen
                  
                  if($start<0) $start = 0;  #Sicherheitsmassnahme
                  
                  $ende = $position + 100; #Ende abhängig von $position bestimmen
                  
                  $diff = $ende-$start-1; Unterschied zwischen $start und $ende bestimmen (Anzahl Zeichen)
                  
                  $reintext = eregi_replace($Suchbegriff,'<font color="#ffcc00">'.$Suchbegriff.'</font>',$reintexta); #Suchbegriff farbig hervorheben
                  
                  $ausgabe = substr($reintext,$start,$diff); #Ausgabe-String festlegen

                  Kommentar


                  • #10
                    Uiuiui was ist denn hier los ?

                    Wenn ich Deine erste Frage richtig verstehe hast Du schon ein result aus einer Abfrage; diese Datensätze sollen Google-Like angezeigt werden !(?)

                    Wenn dem so ist, funktioniert Dein Ansatz (ein bißchen umgestrickt):
                    Code:
                    $text = "Was ein ach so toller Text ist dieser Text doch so toll, dass er nicht toller sein könnte";
                    $Suchbegriff = "toller";
                    echo "Der Text: $text
                    ";
                    
                    $reintexta = strip_tags($text); 
                    if(strpos($reintexta, $Suchbegriff)) 
                    { 
                    $position = strpos($reintexta,$Suchbegriff,1); 
                    $start = $position - 10; 
                    if($start<0) $start = 0; 
                    $ende = $position + 10; 
                    $reintext = substr($reintexta,$start,20);   // (a) 
                    $ausgabe = eregi_replace($Suchbegriff,'<font color="#ff0000">'.$Suchbegriff.'</font>',$reintext);   // (b)
                    } 
                    echo "Ergebnis: ..." .$ausgabe. "...";
                    Achtung: Erst substr (a), dann replace(b), sonst zerschnippelst Du den String womöglich innerhalb Deines <font>-Tags.

                    Findet natürlich nur erstes Vorkommen des substr...
                    OK ?

                    Kommentar


                    • #11
                      Danke, war mir plötzlich auch aufgefallen und habs geändert.....
                      Trotzdem danke....

                      Hab jetzt ne Weile mit Ben rumgewerkelt, aber 100% haben wir es ned hingekriegt, dass der Text nur bei Leerzeichen getrennt wird, aber jetzt ist die wahrscheinlichkeit schon höher und das reicht mir auch....

                      Gruss

                      Kommentar


                      • #12
                        Frickel, Frickel,... so geht's:

                        Code:
                        $text = "Was ein ach so toller Text ist dieser Text doch so toll, dass er nicht toller sein könnte";
                        $Suchbegriff = "toll";
                        echo "Der Text: $text
                        ";
                        $ausgabe="";
                        
                        $reintexta = strip_tags($text); 
                        
                        
                        $offset = 0; // Suche bei pos 0 in $text beginnen
                        while( strpos($reintexta, $Suchbegriff, $offset) && $offset<strlen($text) ) // solange such_string im Text gefunden wird
                        { 
                        	$position = strpos($reintexta, $Suchbegriff, $offset); // start-position such_string
                        
                        	$start = $position - 10;  if($start<0) $start = 0; // vorläufige start-position ausgabe
                        	$ende = $position + strlen($suchbegriff) + 10; // vorläufige end-position ausgabe
                        
                        	// tatsächliche end-position (Wortende) finden
                        	$pos_ende = $ende; 
                        	while ( ctype_alpha($text[$pos_ende]) ) { $pos_ende++; } // solange "buchstaben" solange pos++
                        
                        	// tatsächliche start-position (Wortanfang) finden
                        	$pos_start = $start; 
                        	while ( ctype_alpha($text[$pos_start]) ) { $pos_start--; } // solange "buchstaben" solange pos--
                        	$pos_start++; // Wir wollen ja kein Leerzeichen am Anfang
                        
                        	// Länge zur Nutzung für substr ermittlen
                        	$output_length = $pos_ende-$pos_start;
                        
                        	$reintext = substr($reintexta, $pos_start, $output_length);
                        
                        	// alle ausgaben zusammenhängen
                        	$ausgabe .= "...". eregi_replace($Suchbegriff,'<font color="#ff0000">'.$Suchbegriff.'</font>',$reintext); 
                        
                        
                        	// start-position für weitere while-Schleife => auf Ende des gefundenen such_strings setzen
                        	$offset = $position + strlen($Suchbegriff);	
                        } 
                        
                        echo "Ergebnis: $ausgabe...";
                        Ausgabe:
                        Der Text: Was ein ach so toller Text ist dieser Text doch so toll, dass er nicht toller sein könnte
                        Ergebnis: ...ein ach so toller Text...Text doch so toll, dass...er nicht toller sein...

                        Kommentar


                        • #13
                          Ah du machst das gleich so....Kann man das auch so machen, dass er nur die erste Postition, wo das Suchwort vorkommt ausgibt, denn es gibt User, die als Suchwort "a" eingeben und dann klappt jeder Browser beim Durchsuchen und Ausgeben eines 20 Zeiligen Textes zusammen

                          Gruss

                          Kommentar

                          Lädt...
                          X