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
Annonceindlæg fra inspirit365
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.
24. august 2005 - 00:22
#3
Det ser jo umiddelbart ud til at virke fint :)
24. august 2005 - 00:22
#4
Hmm. Ja bortset fra første hit ;) Bruger du den jeg skrev nu?!
24. august 2005 - 00:23
#5
søg på fanta - så får du hits ud som ikke indeholde ordet "fanta" men fantastisk
24. august 2005 - 00:23
#6
nope - har ikke ændret 2 sek
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
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 :)
24. august 2005 - 00:29
#9
tester lige - mange tak,- den er ogs snart på vej i luften!
24. august 2005 - 00:39
#10
hmm det minder ikke helt om dit eksempel
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%')"; }
24. august 2005 - 00:40
#12
giver det lidt mere mening - jeg troede kun det var et lille fix der skulle til
24. august 2005 - 00:47
#13
Kan det passe det er linien her der skal pilles ved - if(($word!=="OR")AND($word!=="AND"))
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.
24. august 2005 - 00:52
#15
ahhh- godt set :) den havde jeg ikke lige gennemskuet
24. august 2005 - 00:54
#16
Prøv lige med: $like .= "(title REGEXP '(^| |.|,)$word(^| |.|,)' OR description REGEXP '(^| |.|,)$word(^| |.|,)' OR product REGEXP '(^| |.|,)$word(^| |.|,)')";
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:]]')";
24. august 2005 - 00:58
#18
hmm nr 2 giver fejl og den føste funger ikke helt
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:]])')";
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 :/
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
24. august 2005 - 01:03
#22
Hvordan underligt?
24. august 2005 - 01:03
#23
næh sku jeg tror den er der :)
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 :)
24. august 2005 - 01:04
#25
Det ser også fint ud hos mig, efter hvad jeg lige umiddelbart ser :)
24. august 2005 - 01:05
#26
det er cool mange mange tak for hjælpen.
24. august 2005 - 01:05
#27
$searchwords = trim( $searchwords ); og i dit loop: $word = mysql_escape_string( $word );
24. august 2005 - 01:06
#28
Så lidt du, held og lykke med forretningen ;)
24. august 2005 - 01:10
#29
jo tak tak nat der!
Vi tilbyder markedets bedste kurser inden for webudvikling