Avatar billede Slettet bruger
11. marts 2011 - 20:15 Der er 10 kommentarer og
1 løsning

regex - highlight søgeresultat - problem med mellemrum

Hej, jeg bruger flg. kode til at highlighte søgninger:

foreach ($array as $key => $fritekst_keyword_trimmed){
$regex_search = '/('.preg_quote($fritekst_keyword_trimmed,'/').')/i';
$regex_replace = "<span style='background-color: #FFFF66'>$1</span>";
$sc_desc = preg_replace($regex_search,$regex_replace,$sc_desc);


Godt - hvis min $sc_desc eksempelvis er: "Sådan slettes en fil", og jeg søger efter "slettes en", så bliver resultatet <span></span> angiver hvor der er highlighted:

Sådan <span>slettes</span> <span>en</span> fil

- og det er fint.

Søger jeg på "s en" bliver resultatet:
<span>S</span>ådan <span>s</span>lette<span>s</span> <span>en</span> fil

- det er også fint.

MEN - og her kommer problemet så: søger jeg på "slettes e", så bliver resultatet:

Sådan <span>e</span>='background-color: #FFFF66'>sl<span>e</span>tt<span>e</span>s <span>e</span>n fil


Dvs. det fejler når man søger på "ORD [MELLEMRUM] [EET BOGSTAV]" - håber det giver mening, og at der er en, der kan gennemskue det...
Avatar billede tjens Nybegynder
11. marts 2011 - 21:58 #1
Kører den ikke bare på "e" først?

Så er ordet "slettes" ødelagt af to gange <span> inden der søges på "slettes".
Avatar billede Slettet bruger
11. marts 2011 - 22:10 #2
Hej, hmm nej, det er vist ikke det... søger jeg eks. på "en f" bliver resultatet:

Sådan slettes F<span>FFF</span>66'>en <span>f</span>il

... hmmm :-/
Avatar billede tjens Nybegynder
11. marts 2011 - 23:02 #3
Jo, det er derfor:
Prøv at indsætte en echo på $sc_desc inden i dit foreach loop,
for at se hvordan værdien "udvikler" sig undervejs.
Avatar billede Slettet bruger
11. marts 2011 - 23:11 #4
Det forstår jeg ikke - echo $sc_desc; giver mig blot overskriften (altså "Sådan sletter du en fil")... eller gør jeg noget forkert?!

Tak for input. Det giver mig grå hår det her :-)
Avatar billede Slettet bruger
11. marts 2011 - 23:39 #5
Hmm ja, bruger jeg:

$regex_search = '/\b('.preg_quote($fritekst_keyword_trimmed,'/').')\b/i';

- med en søgning på "er d" bliver resultatet "Sådan sletter du en fil" - altså fint, men den highlight'er jo så til gengæld (naturligvis) ikke....
Avatar billede tjens Nybegynder
12. marts 2011 - 00:15 #6
Her er en demo, hvor du kan se indholdet undervejs:
http://tjens.dk/eksperten/php/test933908.php

Når du lave replace på et enkelt bogstav, findes det også indenfor den span der lige er sat ind omkring forrige ord, og dermed går spanstrukturen helt i stykker.
Avatar billede Slettet bruger
12. marts 2011 - 07:23 #7
Hmm ja, er der nogen (nem) vej omkring problemet?

Mange tak for hjælpen.
Avatar billede tjens Nybegynder
12. marts 2011 - 10:23 #8
Du kan måske udføre replace pr. ord, og så fortsætte til næste ord
første gang, der er udført replace.

Demo http://tjens.dk/eksperten/php/test933908b.php

Derved bliver den nye span html ikke udsat for en ny replace.
Avatar billede Slettet bruger
12. marts 2011 - 12:48 #9
Hej tjens,

Du er for viderekommen i fht. mig... kan ikke helt gennemskue, at få det til at spille med min kode. Nu skal du se - det her er hvad jeg har sat ind i mit while-databaseudtræk:

$array = explode(" ", $fritekst_keyword_trimmed); // EXPLODE ARRAY " "


foreach($array as $i => $sc_desc)

  foreach ($array as $key => $fritekst_keyword_trimmed)
  {
    $regex_search = '/('.preg_quote($fritekst_keyword_trimmed,'/').')/i';
    $regex_replace = "<span style='background-color: #FFFF66'>$1</span>";
    $sc_count = 0;
    $sc_arr[$i] = preg_replace( $regex_search, $regex_replace, $sc_desc, -1, $sc_count );
    if ($sc_count > 0) { // Something have been replaced
      $sc_desc = implode(" ", $sc_arr);
      break;
    }
  }
}}


Jeg kan godt se, at der er to "foreach($array" i starten, og det er forkert, men kan ikke lige gennemskue det med din kode, hvor du bruger endnu et array i starten. Lige nu giver en søgning på "er d" flg. resultat:

<span>er</span> <span>d</span>

Den udelader altså resten af teksten i "Sådan sletter du en fil".
Avatar billede tjens Nybegynder
12. marts 2011 - 15:31 #10
Jeg har lavet en omskrivning med nye variabel navne, som bedre beskriver hvordan det virker:

  function HighlighSearchWords($SearchWords, $SearchText) {
    $Search_array = explode(" ", $SearchWords);
    $Text_array = explode(" ", $SearchText);

    foreach($Text_array as $i => $Text_word) {
      foreach ($Search_array as $key => $Search_word) {
        $regex_search = '/('.preg_quote($Search_word,'/').')/i';
        $regex_replace = "<span style='background-color: #FFFF66'>$1</span>";
        $replace_count = 0;
        $Text_array[$i] =
            preg_replace( $regex_search, $regex_replace, $Text_word, -1, $replace_count );
        if ($replace_count > 0) { // Something have been replaced
          break;
        }
      }
    }
    return implode(" ", $Text_array);
  }


Funktionen kaldes med to strings: Søgeord og Søgetekst.

Den returnerer den farvekodede tekst og kan bruges sådan her:

  echo( HighlighSearchWords( $fritekst_keyword_trimmed, $sc_desc ) );


Demo af denne version: http://tjens.dk/eksperten/php/test933908c.php
Avatar billede Slettet bruger
12. marts 2011 - 17:54 #11
Super - mange tak, efter lidt tilpasning ser det ud til at virke.

Dog hvis man søger på "s l e t", så viser den:

<span>S</span>ådan <span>s</span>letter du <span>e</span>n fil 

Men altså - man skal vel heller ikke ligefrem opsøge problemer :-)

Tusind tak for hjælpen!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester