Avatar billede cht22 Professor
22. oktober 2015 - 15:33 Der er 5 kommentarer og
1 løsning

Søgefelt med søgning efter sætninger

Jeg har lavet nedenstående. Det virker meget fint, men kan man på en eller anden måde tage højde for hvis der søges efter tommer, f.eks. 12" eller 12.2" eller er der andet der vil være godt at tage højde for?

Søgefunktion med et søgefelt, der kan søges efter sætninger ved at sætte " omkring:

function Validate($vartext) {
return $vartext;
}


$text = "\"Dette er en sætning\" ikke en sætning \"sætning\"";

$e = explode("\"",$text);

$xcount = 1;

echo "Linjer med lige numre angiver sætninger:\n";

foreach( $e as $line) {

if ($xcount % 2 == 1) {
$words = explode(" ",$line);

foreach($words as $word) {

if ($word != "") {

  $where_select[] = "(title LIKE '%".Validate($word)."%' OR
description LIKE '%".Validate($word)."%')";
}

}

}
else {
$word = $line;

if ($word != "" && $word != " ") {

  $where_select[] = "(title LIKE '%".Validate($word)."%' OR
description LIKE '%".Validate($word)."%')";
}

}
echo $xcount . ": " . $line ." ";
$xcount++;
}

$where = "WHERE not IsNull(active) and active=1 and
".implode($where_select," AND ");


echo $where;
Avatar billede vagnk Juniormester
06. november 2015 - 15:30 #1
Det er nogle dage siden du sendte dette ind, og eftersom der ikke er nogen af de erfarne  der har villet bide skeer med den vil prøve at dykke lidt ned i den.

For det første: Når du har en tekststreng med
  $text = "\"Dette er en sætning\" ikke en sætning \"sætning\"";
og laver en explode med
  $e = explode("\"",$text);
vil du med garanti ikke få det du søger fordi din explode vil finde alle tilfælde med en quote ("). Den vil altså ikke finde tilfælde med escapetegn efterfulgt af quote (\"). Det betyder at du får 4 recs i din array $e (indholdet er det mellem > og <):
0 >Dette er en sætning\<
1 > ikke en sætning \<
2 >sætning\<
3 >< (tom)

Hvis du vil søge præcist på escapestrengen skal den hedde $e = explode ("\\"",$text);
Altså en escpape der escaper escapetegnet \.

En anden ting er at det i mange sprog (herunder php) kan være lidt tricky at arbejde med enkelt- og dobbeltqoutes (' og ") i databaser.

Jeg plejer at gøre det sådanne:
Teksten jeg får fra en formular bliver ændret med
  $felt = str_replace("'", "\\'", $felt);
inden den bliver puttet i DB.

Når den bliver retrievet igen med SELECT laver jeg den modsatte replace med
  $felt = str_replace("\\'", "'", $r['felt']);
Den med \\ læser php som "tag den anden backslash som et tegn og ikke en esacpe"

Både søge- og replace argumenter kan være arrays, så med lidt snilde og evt lidt læsning kan du lave en enkelt replace for både ' og ", så har du fremtidssikret dine sider til brug af måleenheden fod.

Håber det er til hjælp
Avatar billede cht22 Professor
12. november 2015 - 09:54 #2
Det første du skriver med replace af ' er jeg med på. Det har jeg i min validate funktion, det har jeg dog ikke skrevet, det ser lidt anderledes ud end vist tidligere.

Men resten af de erstatninger du skriver er jeg ikke helt med på hvordan skulle kunne gøre at der kan søges i tekst som indeholder " og hvordan det bliver fremtidssikret til måleenheden fod, det er jeg ikke med på. Det var tommer jeg gerne ville kunne søge efter.
Avatar billede vagnk Juniormester
12. november 2015 - 13:44 #3
Den med fod var måske lidt hovski-snovski, og forvirrer mere end nødvendigt.
Fra WIKI:
En fod (1') opdeles i 12 tommer (12''), der hver opdeles i 12 linjer (12''')
.
I php kan vi afgrænse tekststrenge med enkelt- eller dobbeltquotes - "Kristian d. X' Alle" eller 'Kristian d. X\' Alle'. Læg mærke til at den interne quote i andet eksempel skal escapes.

Min pointe er imidlertid at gemme i DB med escapetegn. Når du skal bruge indholdet f.eks. på en hjemmeside må du i de allerfleste tilfælde strippe escapetegnet. Hvis du allerede har data i DB uden quotes er der en MySQL-funktion der hedder REPLACE() den kan du sikkert bruge til at rette DB op til dit behov.

Jeg kunne tænke mig noget i retning af:
UPDATE tbl SET felt = REPLACE (felt, "'", "\'");

Den skal naturligvis laves for både single- og bobbelt-quotes.

I øvrigt er der i php et par funktioner addslashes() og stripslashes() der er hurtigere end str_replace(). I hvert fald i den lille test jeg lavede med 10.000 recs.
Avatar billede cht22 Professor
25. januar 2016 - 17:57 #4
Jeg har valgt at der undersøges om der er et lige eller ulige antal ", for at finde ud af om der er tale om sætninger. Der gøres således ikke brug af replace som du foreslår, men jeg vil gerne give point for forsøget.
Avatar billede vagnk Juniormester
26. januar 2016 - 14:54 #5
Det er sæføli osse en mulighed, men hvad sker der hvis du får en sætning som f.eks. "Jens' adresse er Kristian d. X' Alle"?
Avatar billede cht22 Professor
30. januar 2016 - 15:07 #6
Ja så vil det blive betragtet som en sætning.

Nu ved jeg ikke helt om ? er med i din søgning, hvis det er så skal sætningen findes og der skal være ? et sted i de poster der bliver fundet. Det kan optimeres, men det er meget godt som det er nu.
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
Computerworld tilbyder specialiserede kurser i database-management

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