Avatar billede daniel_d Nybegynder
26. oktober 2002 - 15:52 Der er 36 kommentarer og
1 løsning

Søge - vist noget med arrays ???

I mit forsøg på at sammensætte noget der skulle blive til en nogenlunde fornuftig indexsøger til egne access databaser er jeg stødt ind i et par problemer som jeg ikke kan se mig ud af.

Mit problem er kort sagt visning af søgeresultatet. Jeg har forsøgt mig med en funktion som viser de første 250 tegn af den fundne artikel eller side om man vil. Bruger i den forbindelse en highlight funktion som markerer søgeordet i teksten. Det virker også fint nok hvis søgeordet ligger i de første 250 ord, men er søgeordet derefter sker der ingen markering.

Problemet er med andre ord at ved visning af søgeresultatet ikke nødvendigvis skal vise de FØRSTE 250 tegn, men f.eks. 250 tegn fra søgeordet.

Målet er at vise eks. 10 tegn før søgeordet og 20 efter søgeordet + "..." - derefter søge efter søgeordet igen - finder den det igen - samme procedure til max 250 tegn er vist.

Jeg tror man skal ind på arrays, men idet jeg er så usikker på dette er det også at jeg stiller spørgsmålet her. Jeg tror også det er noget som andre kunne finde interessant.

Mvh
Daniel Duvald
Avatar billede a1a1 Novice
26. oktober 2002 - 16:12 #1
du skal ikke bruge arrays til det.

det du skal bruge er instr (finder en variabel i en anden)
ala
hvorersoegeord = instr(databasetekst, sogeord)

og mid (udtrækker en del af en variabel mid(streng, hvordenstarter, [længde],længde er optional)

din kode til at få -10 og 20 der efter vil så være noget ala

tekst = mid( Rs("databasetekst"), (hvorersoegeord-10), (Len(sogeord)+20) )

håber at det giver lidt mening :)

;)
Avatar billede a1a1 Novice
26. oktober 2002 - 16:12 #2
mid (udtrækker en del af en variabel mid(streng, hvordenstarter, [længde]) længde er optional

;)
Avatar billede dr-data Nybegynder
26. oktober 2002 - 16:17 #3
kan også bruge replace(tekst, ord, "<span id=highlighted>" & ord & "</span>")
Avatar billede dr-data Nybegynder
26. oktober 2002 - 16:18 #4
altså en gang pr ord....
Avatar billede a1a1 Novice
26. oktober 2002 - 16:19 #5
men hvis søge ordet findes før det 10. tegn vil (hvorersoegeord-10) give mindre end 1, det må det ikke være, så der skal et ekstra check på

ala

hvorersoegeord = instr(databasetekst, sogeord)
hvorersoegeord = (hvorersoegeord-10)
if hvorersoegeord < 1 Then
hvorersoegeord = 1
End If
tekst = mid( Rs("databasetekst"), hvorersoegeord, (Len(sogeord)+20) )

;)
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:19 #6
Det ser ikke helt sort ud, men skal lige tygge på den...

Lige nu bruger jeg bare       
response.write Regreplace(LEFT(rs("article"), 250))
hvor regreplace fjerer alle html tags ,men den er ikke helt så kanon som den kunne være...

lidt mere konkret så hedder mit:

Søgeord: strKeyword
dbudtræk: atricle

Det du siger er så f.eks.
Dim strKeyword, hvorsøgeord,
Hvorsøgeord = instr(Rs("article"),strKeyword)
strOutput = mid( Rs("article"),(hvorsøgeord-10),(Len(strKeyword)+20))

Eller er jeg helt gal på den ?
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:21 #7
dr-data> jeg har ingen probs med highlight funktionen... Det er mit søgeoutput
Avatar billede a1a1 Novice
26. oktober 2002 - 16:22 #8
det ser fint ud (bare ikke ø i variablerne ;o) )
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:23 #9
Dim strKeyword, hvorsøgeord,

Hvorsøgeord = instr(Rs("article"),strKeyword)
Hvorsøgeord = (hvorsøgeord -10)
  if hvorsøgeord < 1 Then
    hvorsøgeord = 1
  End If
strOutput = mid( Rs("article"),(hvorsøgeord-10),(Len(strKeyword)+20))

Sådan du mener ?
Avatar billede a1a1 Novice
26. oktober 2002 - 16:23 #10
og husk lige det her

hvorersoegeord = instr(databasetekst, sogeord)
hvorersoegeord = (hvorersoegeord-10)
if hvorersoegeord < 1 Then
hvorersoegeord = 1
End If
strOutput = mid( Rs("article"),hvorersoegeord ,(Len(strKeyword)+20))
Avatar billede a1a1 Novice
26. oktober 2002 - 16:24 #11
oui :)
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:24 #12
ingen ø, nej det er klart... bruger selv altid engelsk i programmerings-sammenhæng, men prøver at få det til at hænge sammen :o)
Avatar billede a1a1 Novice
26. oktober 2002 - 16:24 #13
no
ikke
strOutput = mid( Rs("article"),(hvorsøgeord-10),(Len(strKeyword)+20))
du HAR jo trukket 10 fra :)
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:25 #14
ahh... ja...
tak
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:35 #15
virker ikke helt... den viser ikke 250 ord men kun det ord som der søges på...

sådan ser det ud:

Regreplace er som sagt stadig en funktion som fjerne al html formatering

strOutput = Regreplace(mid( Rs("article"),FindStrKeyword ,(Len(strKeyword)+20)))

??
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:37 #16
og stadigvæk viser den ikke hvis jeg lavede en søgning på et ord som er sidst på siden...
Avatar billede a1a1 Novice
26. oktober 2002 - 16:37 #17
btw. det bliver straks mere besværligt hvis du vil "søge" videre i teksten
Avatar billede a1a1 Novice
26. oktober 2002 - 16:38 #18
de første 250 skal du skrive ud som du plejer :)
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:39 #19
Sådan ser hele funktionen ud (har ikke medtaget highlight samt regreplace funktionen her:

If Not (rs.BOF Or rs.EOF) Then
    ' Hvis der er fundet poster på søgningen
    Response.Write "<p>Søgeresultat</p>"
    Response.Write "<table border=0>"
   
    Do While Not rs.EOF
   
    FindStrKeyword = instr(databasetekst, sogeord)
    FindStrKeyword = (hvorersoegeord-10)
      if FindStrKeyword < 1 Then
        FindStrKeyword = 1
      End If
   
    strOutput = Regreplace(mid( Rs("article"),FindStrKeyword ,(Len(strKeyword)+20)))
    ' Gammel streng: strOutput = Regreplace(LEFT(rs("article"), 250))
   
    'formaterer strengen med highlight af søgeord + ... ved slut
    VarWord = strKeyword
    strOutput = strOutput + "<b>...</b>"
    HighlightText = Highlight(strOutput, VarWord, "<Span style='\background-color:#FFFF00;\'>", "</Span>")
   
    'Her udskriver vi vores søgeresultat
    Response.Write "<tr><td style='\border-bottom: 1 dotted #000000'\><b>" & rs("Title") & "</b></td></tr>"
    Response.Write "<tr><td>" & HighlightText & "</td></tr>"
    Response.Write "<tr><td><a href=""index.asp?id=" & rs("id") & """( target=""_parent"">Link til siden</a></td></tr>"
   
    rs.MoveNext
    Loop
   
    Response.Write "</table>"
Else
    ' Hvis der ikke er fundet poster på søgningen
    Response.Write "<p>Der er ikke fundet noget på denne søgning</p>"
End If
Avatar billede a1a1 Novice
26. oktober 2002 - 16:41 #20
;)

FindStrKeyword = instr(databasetekst, sogeord)

skal vel være

FindStrKeyword = instr(Rs("article"), sogeord)
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:48 #21
heh.... nu viser den ingen ting fra søgeresultatet! - kun link og titel til søgeresultatet...

Vil du ha hele koden ?
Avatar billede a1a1 Novice
26. oktober 2002 - 16:52 #22
prøv at skrive den
Avatar billede a1a1 Novice
26. oktober 2002 - 16:55 #23
hov, havde vist ikke kigget godt nok efter

FindStrKeyword = instr(databasetekst, strKeyword)
hvorersoegeord = (FindStrKeyword-10)
if hvorersoegeord < 1 Then
hvorersoegeord = 1
End If

og...

strOutput = Regreplace(mid( Rs("article"),hvorersoegeord ,(Len(strKeyword)+20)))

;)
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 16:56 #24
Prøver lige før jeg smider hele koden...
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 17:00 #25
Nu skriver den da noget, men kun 1 ord igen... Ved ikke helt hvor jeg skal placere de ,250 ?
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 17:04 #26
FindStrKeyword = instr(databasetekst, strKeyword)
skulle jo gerne være
FindStrKeyword = instr(rs("article"), strKeyword)
Men gør jeg det får jeg problem er med en RegEx.Replace som dem melder fejl på!... Hmmm
Avatar billede a1a1 Novice
26. oktober 2002 - 17:05 #27
som jeg sagde

btw. det bliver straks mere besværligt hvis du vil "søge" videre i teksten

;)
Avatar billede a1a1 Novice
26. oktober 2002 - 17:07 #28
hvad er fejlen?
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 17:07 #29
Microsoft VBScript runtime error '800a000d'
Type mismatch: 'regEx.Replace'

/sog/search.asp, line 42
Avatar billede a1a1 Novice
26. oktober 2002 - 17:11 #30
prøv at fjerne Regreplace og se om det virker..:)
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 17:12 #31
Har fundet fejlen tror jeg, men nu er der ingen tekst ... hmmm.

Jeg poster lige hele koden her :O) - det er den nederste del som er mest interessant!

<% Response.Buffer = True %>
<html><head>
<title>Søgeresultat</title>
<link rel="stylesheet" type="text/css" href="default.css">
</head>

<body>

<%
' Henter værdien fra soeg.htm
dim strKeyword
strKeyword = Trim(Request.Form("Keyword"))

If Len(strKeyword) = 0 Then
    ' Hvis der ikke er skrevet i feltet
    Response.Clear
    Response.Redirect("index.asp")
Else
    ' Hvis der er skrevet i feltet
    strKeyword = Replace(strKeyword,"'","''")
End If

' Opbygger en dynamisk SQL streng
strSQL = "SELECT ID, Title, Article FROM Articles WHERE"
strSQL = strSQL & " (Title LIKE '%" & strKeyword & "%')"
strSQL = strSQL & " OR (Article LIKE '%" & strKeyword & "%')"

' Skaber DSNLess forbindelse til DBen
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("CMS.mdb")
Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open strDSN

' Skaber et recordset udfra SQL strengen
Set rs = myConn.Execute(strSQL)

Function RegReplace(inStr)
  Dim regEx
  Set regEx = New RegExp
  regEx.Global = True
  regEx.IgnoreCase = True
  regEx.Pattern = "<[^>]+>"
  inStr=regEx.Replace(inStr, "")
  RegReplace=inStr
End Function


Function Highlight(strText, strFind, strBefore, strAfter)

' Parameters:
' strText     - string to search in
' strFind    - string to look for
' strBefore    - string to insert before the strFind
' strAfter     - string to insert after the strFind

    Dim nPos
    Dim nLen
    Dim nLenAll
   
    nLen = Len(strFind)
    nLenAll = nLen + Len(strBefore) + Len(strAfter) + 1

    Highlight = strText

    If nLen > 0 And Len(Highlight) > 0 Then
        nPos = InStr(1, Highlight, strFind, 1)
        Do While nPos > 0
            Highlight = Left(Highlight, nPos - 1) & _
                strBefore & Mid(Highlight, nPos, nLen) & strAfter & _
                Mid(Highlight, nPos + nLen)

            nPos = InStr(nPos + nLenAll, Highlight, strFind, 1)
        Loop
    End If
End Function

If Not (rs.BOF Or rs.EOF) Then
    ' Hvis der er fundet poster på søgningen
    Response.Write "<p>Søgeresultat</p>"
    Response.Write "<table border=0>"

    Do While Not rs.EOF
   
    databasetekst = RegReplace(rs("article"))
    FindStrKeyword = instr(databasetekst, strKeyword)
    hvorersoegeord = (FindStrKeyword-10)
      if hvorersoegeord < 1 Then
        hvorersoegeord = 1
      End If

    strOutput = mid(rs("article"),hvorersoegeord ,(Len(strKeyword)+20))
   
    ' Gammel strOutput = Regreplace(LEFT(rs("article"), 250))
   
    'formaterer strengen med highlight af søgeord + ... ved slut
    VarWord = strKeyword
    strOutput = strOutput + "<b>...</b>"
    HighlightText = Highlight(strOutput, VarWord, "<Span style='\background-color:#FFFF00;\'>", "</Span>")
   
    'Her udskriver vi vores søgeresultat
    Response.Write "<tr><td style='\border-bottom: 1 dotted #000000'\><b>" & rs("Title") & "</b></td></tr>"
    Response.Write "<tr><td>" & HighlightText & "</td></tr>"
    Response.Write "<tr><td><a href=""index.asp?id=" & rs("id") & """( target=""_parent"">Link til siden</a></td></tr>"
   
    rs.MoveNext
    Loop
   
    Response.Write "</table>"
Else
    ' Hvis der ikke er fundet poster på søgningen
    Response.Write "<p>Der er ikke fundet noget på denne søgning</p>"
End If
' Rydder op efter os
myConn.Close
Set myConn = Nothing
%>

</body>
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 17:16 #32
Fandt fejlen:

Lå i:     strOutput = mid(databasetekst,hvorersoegeord ,(Len(strKeyword)+20))
som før var
    strOutput = mid(rs("article"),hvorersoegeord ,(Len(strKeyword)+20))

Men jeg havde defineret databasetekst = re("article")

Nu mangler den kun at skrive de søgeord den finder andre steder i teksten, men det var svært eller hva mente du ?
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 17:19 #33
øhhh rs("article")
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 17:23 #34
Skal lige ha noget i skrotten, men kommer tilbage om lidt...
Avatar billede a1a1 Novice
26. oktober 2002 - 17:23 #35
det er noget mere besværligt

det her

    FindStrKeyword = instr(databasetekst, strKeyword)
    hvorersoegeord = (FindStrKeyword-10)
      if hvorersoegeord < 1 Then
        hvorersoegeord = 1
      End If

skal flyttes til en funktion, du skal kalde indtil søge ordet ikke er mere i teksten

kan ikke lige helt gennemskue hvordan lige nu :)

;(
Avatar billede daniel_d Nybegynder
26. oktober 2002 - 17:56 #36
øv *G*
Kunne prøve at oprette et nyt ? om det :o)

Men jeg takker for al din hjælp. Min søgemask. er blevet noget bedre nu!

Point til dig!
Avatar billede a1a1 Novice
27. oktober 2002 - 17:34 #37
tak for points :)

jeg kan godt prøve at hjælpe dig med funktionen....

;)
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
Kurser inden for grundlæggende programmering

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