X Wörter vor und nach dem Suchtreffer ausgeben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • X Wörter vor und nach dem Suchtreffer ausgeben

    Hallo Coder,

    wie es der Titel schon sagt, möchte ich z.B. 5 Wörter vor und nach dem Suchtreffer ausgeben.
    Bis zur Positionsermittlung der Suchbegriffe war es kein Problem, aber leider weiss ich nun nicht weiter.
    Habe es schon mit substr versucht, bekomme es aber nicht gebacken :( .
    Könnt ihr mir helfen?
    Hier mal mein Snippet:

    Quellcode

    1. $string = strip_tags($string);
    2. $stringlow = strtolower($string);
    3. $searchlow = strtolower($search);
    4. # die und-Verknüpfung:
    5. $search_arr = explode(" ",trim($searchlow));
    6. $search_count = count($search_arr);
    7. $i = 0;
    8. $trefferArray = array(); // Array definieren
    9. foreach ($search_arr as $search_word) // Suchbegriffe durchlaufen
    10. {
    11. if (preg_match("/($search_word)/i", $stringlow)) // wenn Suchbegriff gefunden wurde
    12. {
    13. $i++;
    14. $pos = strpos($stringlow, $search_word);
    15. // echo "Position = ".$pos."<br>";
    16. ///////////////////////////////////////////////
    17. // Dieser Teil fehlt mir :(
    18. // $rest = ???;
    19. ///////////////////////////////////////////////
    20. // Suchstring mit 5 Wörter vor und nach dem Treffer in das Array schreiben
    21. array_push($trefferArray, $rest);
    22. // Wenn alle Suchbegriffe gefunden wurden, Array mit Treffer-Texte ausgeben
    23. $arr_treffer = count($trefferArray);
    24. if ($arr_treffer == $search_count)
    25. {
    26. foreach($trefferArray as $treffer)
    27. {
    28. echo " ".$treffer." ";
    29. }
    30. }
    31. }
    32. }
    Alles anzeigen

    Schon mal danke im Vorraus!

    Grüße KMD
  • Soory für die Unübersichtlichkeit, aber ich bin gerade etwas verplant ;) Hoffe es gibt dir einen Denkanstoß:

    Quellcode

    1. $wordwrap = 5;
    2. $hit = array();
    3. $i = 0;
    4. foreach ($search_arr as $search_word) {
    5. if (preg_match('/('.$search_word.')/i', $stringlow)) {
    6. $y = ($wordwrap <= $i) ? ($i-$wordwrap) : $i;
    7. for ($x=0; $x <= ($wordwrap*2); $x++) {
    8. $hit[] = ($y == $i) ? '<b>'.$search_arr[$y].'</b>' : $search_arr[$y];
    9. $y++;
    10. }
    11. break;
    12. }
    13. $i++;
    14. }
    Alles anzeigen
    MfG dynambee
  • Hi auch,

    um die Wörter zu finden brauchst Du den Indexwert des Treffers.
    Dazu erweiter mal

    PHP-Quellcode

    1. foreach ($search_arr as $search_word) // Suchbegriffe durchlaufen

    zu dem hier:

    PHP-Quellcode

    1. foreach ($search_arr as $nr => $search_word) // Suchbegriffe durchlaufen

    anschließend die Wörter zusammensammeln:

    PHP-Quellcode

    1. for ($i=$nr-5; $i<=$nr+5; $i++){
    2. if($i>=0 && $i<count($search_arr)){
    3. $trefferArray[]= $search_arr[$i];
    4. }
    5. }


    fettich, oder?

    Schönen Gruß!

    [EDIT]

    argh, mist , dynambee war schneller. na, hast nun die freie Auswahl. :P
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Jeder glaubt, er hätte genug davon.
    --------------------------------------------------(Rene Descartes)
  • Hm, Wettbewerb ....Coding-Contest! :D

    Eine Aufgabe, mehrere Lösungsvarianten.

    Du hast die Wortanzahl vorbildlich in ner eigenen Variable gepackt, dafür aber eine neue fremde Variable für die Ausgabe verwendet, obwohl eine vorgegeben war. Du hast die schön kurzen Trinitätsoperatoren benutzt, ich dafür wiederum die weniger bekannte $key->$value Syntax bei foreach...

    das ist ACTION :thumbsup:
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Jeder glaubt, er hätte genug davon.
    --------------------------------------------------(Rene Descartes)
  • Hallo Leute,

    immerwieder schön mehrere Varianten zu bekommen :thumbup: .
    Aber beides liefert nicht das gewünschte Ergebniss :(

    Vielleicht habe ich mich falsch ausgedrükt.

    ich habe volgenden String:
    "Conquesto sit amet, consectetuer adipiscing mibiles Pra vestibulum. Lorem ips mibiles dolor sit at, consectet adipiscing elit. vestibulum. Praesent mibiles vestibulum molestie lacus. molestie lacus. Adiplicting wello. Lorem ips dolor Aenean nonummy. Der innuri la moru. Sit amet, lumi."

    Angenommen die Sucheingabe sieht wie folgt aus: "adipiscing dolor innuri"

    Dann sollte das script folgende Strings in das Array "trefferArray" schreiben (Immer nur der erste Treffer String)
    1 String: "Conquesto sit amet, consectetuer adipiscing mibiles Pra vestibulum. Lorem ips"
    2 String: "Pra vestibulum. Lorem ips mibiles dolor sit at, consectet adipiscing elit."
    3 String: "ips dolor Aenean nonummy. Der innuri la moru. Sit amet, lumi."

    so das die Ausgabe des Arrays wie Folg aussieht:
    Conquesto sit amet, consectetuer adipiscing mibiles Pra vestibulum. Lorem ips ... Pra vestibulum. Lorem ips mibiles dolor sit at, consectet adipiscing elit. ... ips dolor Aenean nonummy. Der innuri la moru. Sit amet, lumi.

    Grüße KMD
  • aso, ja das muß man ja auch wissen, was ins Ergebnis-Array soll.
    Unsere Varianten schmissen die Wörter jeweils als einzelnes Feld da hinein.

    Na denn, eine kleine Umstellung bei mir:

    PHP-Quellcode

    1. $row='';
    2. for ($i=$nr-5; $i<=$nr+5; $i++){
    3. if($i>=0 && $nr!=$i && $i<count($search_arr)){
    4. $row.= ' '.$search_arr[$i];
    5. }
    6. if($i==$nr){
    7. $row.=' <b>'.$search_arr[$i].'</b>';
    8. }
    9. }
    10. $trefferArray[]=trim($row);
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Jeder glaubt, er hätte genug davon.
    --------------------------------------------------(Rene Descartes)
  • ahhahah ich hab auch ne Lösung gemacht, keine Ahnung aber ich hab mir eure nicht angeguckt, daher is sie etwas anders und auch umständlicher :D

    Quellcode

    1. <?php
    2. error_reporting(E_ALL);
    3. define('FINDWORDS_CS', true);
    4. /**
    5. * Sucht woerter und gibt umliegende Woerter mit zurueck
    6. *
    7. * @param string $subject
    8. * @param string $needle
    9. * @param bool $cs = false (Usw: cons. FINDWORDS_CS)
    10. * @param int $length_l Wieviele Woerter sollen Links von dem Suchbegriff ausgegeben werden?
    11. * @param int $length_r Wieviele Woerter sollen Rechts von dem Suchbegriff ausgegeben werden?
    12. * @param string $delimiter Was fuer ein Trennzeichen soll verwendet werden
    13. * @return Array ([1] => string $res1, [2] => string $res2, ...)
    14. * @author KeksNico
    15. * @version 0.1
    16. */
    17. function findWords($subject, $needle, $cs = false, $length_l = 5, $length_r = 5, $delimiter = ' ') {
    18. // Validation
    19. $w_needle = !$cs? strToLower($needle): $needle;
    20. $w_subject = !$cs? strToLower($subject): $subject;
    21. $length_l = (int) $length_l;
    22. $length_r = (int) $length_r;
    23. // Vorbereitungen..
    24. $d_c = substr_count($w_subject, $delimiter);
    25. $bumm_subject = explode($delimiter, $subject);
    26. $bumm_subject_keys = array_keys($bumm_subject, $w_needle);
    27. $bumm_count = count($bumm_subject);
    28. // Los...
    29. $result = Array();
    30. foreach ($bumm_subject_keys as $n => $key) {
    31. $start = $key -$length_l;
    32. $end = $key +$length_r +1;
    33. // Validierung...
    34. $start = $start <0? 0: $start;
    35. $words = Array();
    36. for ($i = $start; $i < $end && $i < $bumm_count; ++$i) {
    37. $words[] = $bumm_subject[ $i ];
    38. }
    39. $result[] = implode($delimiter, $words);
    40. }
    41. return $result;
    42. }
    43. // Test und soo
    44. $search = 'und';
    45. $string = 'hallo ich bin peter pan und ich esse gerne gurke mit wurst mit einem gebratenem Ei ... und DU?
    46. Also ich finde es eigentlich immer gut wenn man das Wort und benutzt, weil es einfach super toll ist UND SO';
    47. $results = findWords($string, $search, FINDWORDS_CS);
    48. foreach ($results as $n => $result) {
    49. printf('%d) %s <br/>', $n, str_replace($search, '<b>'.$search.'</b>', $result));
    50. }
    51. ?>
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von KeksNico ()