Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:10 Der er 28 kommentarer og
1 løsning

Søg efter Præcise søgeord

Hey!

Jeg har en shop hvor jeg har en søge funktion, og mit problem er den finder for meget ;)

Hvis jeg søger på "fanta" finder den f.eks. også fantastisk

jeg ønsker kun den skal finde præcis de ord man skriver,

udpluk af min search.php:

$search = ereg_replace("~<script[^>]*>.+</script[^>]*>~isU", "", strip_tags(strtoupper($search)));

$searchwords = split ( "[ ,]", $search );


Jeg tror det er her der skal modificeres, men hvad- kan jeg ikke gennemskue

Håber du kan hjælpe mig lidt videre med mit projekt

vh Acker
Avatar billede coderdk Praktikant
24. august 2005 - 00:15 #1
Denne vil kun finde fanta - \b er "word boundary".

  preg_match( "!\bfanta\b!", $txt )

Det anbefales at bruge preg_* funktionerne fremfor ereg_* da de oftest er hurtigere.
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:18 #2
du kan teste den selv på http://www.mixmeister.dk
Avatar billede coderdk Praktikant
24. august 2005 - 00:22 #3
Det ser jo umiddelbart ud til at virke fint :)
Avatar billede coderdk Praktikant
24. august 2005 - 00:22 #4
Hmm. Ja bortset fra første hit ;) Bruger du den jeg skrev nu?!
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:23 #5
søg på fanta - så får du hits ud som ikke indeholde ordet "fanta" men fantastisk
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:23 #6
nope - har ikke ændret 2 sek
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:25 #7
hmmm jeg kan ikke lige gennem skue hvordan jeg skal få din kodestump ind? sry men er ikke helt så fix til php
Avatar billede coderdk Praktikant
24. august 2005 - 00:28 #8
Hmm ja, nu er det jo kun et udpluk du har vist, så det er lidt svært.
Men for at søge efter ét ord i en text:

    $txt = "Den består af øl og lemon som smager fantastisk og giver en frisk og syrlig smag.";
    $sogeord = "fanta";
    if ( preg_match( "!\b" . preg_quote( $sogeord, "!" ) . "\b!", $txt ) )
    {
        echo "Fundet!";
    }
    else
    {
        echo "Ikke fundet!";
    }


Bortset fra det - Ganske flot site, fedt koncept :)
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:29 #9
tester lige - mange tak,- den er ogs snart på vej i luften!
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:39 #10
hmm det minder ikke helt om dit eksempel
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:40 #11
$search = ereg_replace("~<script[^>]*>.+</script[^>]*>~isU", "", strip_tags(strtoupper($search)));

    $searchwords = split ( "[ ,]", $search ); 

    foreach ($searchwords as $word) 
        {
            if(($word!=="OR")AND($word!=="AND"))
                {
                    //START DATABASE SEARCH CHECK

                    $word = ucwords($word);

                    $sql_sel = "select * from ".$prefix."store_search where searchstr='$word'";
                    $result = mysql_query ($sql_sel);
                    $totalrows = mysql_num_rows($result);

                    if($totalrows==0)
                        {
                            $sql_insert = "insert into ".$prefix."store_search set searchstr='$word', hits='1'";
                            $result = mysql_query ($sql_insert);
                        }
   
                    if($totalrows>0)
                        {
                            while ($row = mysql_fetch_array($result))
                                {
                                    $old_hits = $row["hits"];
                                }

                            $new_hits = $old_hits + 1;
                            $sql_update = "update ".$prefix."store_search set hits='$new_hits' where searchstr='$word'";
                            $result = mysql_query ($sql_update);
                       
                        }// end if ($totalrows==1)

                    // END DATABASE CHECK
   
                }// end if(($word!=="OR")OR($word!=="AND"))
   
                if(($word!=="AND")AND($word!=="OR"))
                    {
                        $like .= "(title LIKE '%$word%' OR description LIKE '%$word%' OR product LIKE '%$word%')";
                    }
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:40 #12
giver det lidt mere mening - jeg troede kun det var et lille fix der skulle til
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:47 #13
Kan det passe det er linien her der skal pilles ved -

if(($word!=="OR")AND($word!=="AND"))
Avatar billede coderdk Praktikant
24. august 2005 - 00:50 #14
Nej, der er et lille problem ;) Linjen der søger er faktisk ikke PHP, men (My)SQL og findes her:

$like .= "(title LIKE '%$word%' OR description LIKE '%$word%' OR product LIKE '%$word%')";

Så du kan ikke bruge min løsning... MySQL har godt nok en REGEXP funktion, men den er vist lidt primitiv, så vidt jeg husker. Kigger lige et øjeblik på det.
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:52 #15
ahhh- godt set :) den havde jeg ikke lige gennemskuet
Avatar billede coderdk Praktikant
24. august 2005 - 00:54 #16
Prøv lige med:

$like .= "(title REGEXP '(^| |.|,)$word(^| |.|,)' OR description REGEXP '(^| |.|,)$word(^| |.|,)' OR product REGEXP '(^| |.|,)$word(^| |.|,)')";
Avatar billede coderdk Praktikant
24. august 2005 - 00:56 #17
Hmm eller måske:

$like .= "(title REGEXP '[^[:alnum:]]$word[^[:alnum:]]' OR description REGEXP '[^[:alnum:]]$word[^[:alnum:]]' OR product REGEXP '[^[:alnum:]]$word[^[:alnum:]]')";
Avatar billede ackers.tk Nybegynder
24. august 2005 - 00:58 #18
hmm nr 2 giver fejl og den føste funger ikke helt
Avatar billede coderdk Praktikant
24. august 2005 - 00:58 #19
Ok testede lige lidt, prøv med:

$like .= "(title REGEXP '(^|[^[:alnum:]])$word(\$|[^[:alnum:]])' OR description REGEXP '(^|[^[:alnum:]])$word(\$|[^[:alnum:]])' OR product REGEXP '(^|[^[:alnum:]])$word(\$|[^[:alnum:]])')";
Avatar billede ackers.tk Nybegynder
24. august 2005 - 01:02 #20
det virker lidt :) - men det er ikke muligt at søge på 2 ord så opføre den sig underligt :/
Avatar billede coderdk Praktikant
24. august 2005 - 01:02 #21
Forklaring:

(^|[^[:alnum:]])$word(\$|[^[:alnum:]])

Før ordet skal en af disse være opfyldt:

^ = starter med - altså teksten må godt starte med ordet
[^[:alnum:]] der må ikke være alfabetiske tegn (inkl. tal) foran ordet

Efter ordet skal en af disse være opfyldt:

\$ = (faktisk bare $) ordet må godt være det sidste i en tekst
[^[:alnum:]] der må ikke være alfabetiske tegn (inkl. tal) efter ordet

| er "eller" og () bliver brugt til at gruppere valgmulighederne
Avatar billede coderdk Praktikant
24. august 2005 - 01:03 #22
Hvordan underligt?
Avatar billede ackers.tk Nybegynder
24. august 2005 - 01:03 #23
næh sku jeg tror den er der :)
Avatar billede ackers.tk Nybegynder
24. august 2005 - 01:04 #24
det er bare hvis man kommer til at lave "mellem" til sidst i søgerubrikken så kan den ikke finde ud af det :)
Avatar billede coderdk Praktikant
24. august 2005 - 01:04 #25
Det ser også fint ud hos mig, efter hvad jeg lige umiddelbart ser :)
Avatar billede ackers.tk Nybegynder
24. august 2005 - 01:05 #26
det er cool mange mange tak for hjælpen.
Avatar billede coderdk Praktikant
24. august 2005 - 01:05 #27
$searchwords = trim( $searchwords );

og i dit loop:

$word = mysql_escape_string( $word );
Avatar billede coderdk Praktikant
24. august 2005 - 01:06 #28
Så lidt du, held og lykke med forretningen ;)
Avatar billede ackers.tk Nybegynder
24. august 2005 - 01:10 #29
jo tak tak nat der!
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