Avatar billede lklingenberg Nybegynder
08. juli 2003 - 20:04 Der er 5 kommentarer og
2 løsninger

Markering af baggrund for hele ord og ikke for dele af ord

En lidt kryptisk overskrift, men jeg kunne ikke finde noget mere dækkende...

I en søgefunktion trækker jeg sidens beskrivelse ud af sidernes meta informationer. Beskrivelsen bliver listet op sammen med sidens titel (og et par andre ting) for de sider hvor søgeparamtrene passer. Det er der for så vidt ingen problemer i. Jeg vil dog gerne have ændret fx baggrund for de ord i beskrivelsen hvor søgeordet eller søgeordene forekommer. Det har jeg gjort via denne model:

For i = 0 To intArrSearchWords
  strPageDescription = Replace(strPageDescription, arrSearchWords(i), "<span style=""background-color: yellow"">" & arrSearchWords(i) & "</span>")
Next

Hvor arrSearchWords er det array der indeholder brugerens søgeord og intArrSearchWords er antallet af værdier i arrayet. strPageDescription er naturligvis sidens beskrivelse.

Der er to problemer i denne forholdsvis simple metode: 1) søger man fx på ordet 'er' bliver alle ord hvor kombinationen er forekommer (fx forekommer ;-) og 2) metoden er case sensitiv.

Er der nogen der kan hjælpe mig med at omgå de to problemer?

/Lars
Avatar billede tuctoh Nybegynder
08. juli 2003 - 20:35 #1
ok... som svar på det første problem kan du prøve med:

For i = 0 To intArrSearchWords
  strPageDescription = Replace(" "&strPageDescription&" ", " "&arrSearchWords(i)&" ", "<span style=""background-color: yellow""> " & arrSearchWords(i) & " </span>")
Next


angående case sensitivitet... jeg vil se om jeg kan finde en løsning.
Avatar billede lklingenberg Nybegynder
08. juli 2003 - 21:44 #2
Jeg har prøvet en lidt anden variant, men det at sætte mellemrum 'omkring' strPageDescription var ny - og den virker også. Det skaber bare problemer i de tilfælde hvor ordet der skal fremhæves er før et punktum eller et komma. Det kunne løses med følgende:

For i = 0 To intArrSearchWords
  strPageDescription = Replace(" " & strPageDescription & " ", " " & arrSearchWords(i) & " ", " <span style=""background-color: yellow"">" & arrSearchWords(i) & "</span> ")
  strPageDescription = Replace(strPageDescription, arrSearchWords(i) & ", ", " <span style=""background-color: yellow"">" & arrSearchWords(i) & "</span>, ")
  strPageDescription = Replace(strPageDescription, arrSearchWords(i) & ". ", " <span style=""background-color: yellow"">" & arrSearchWords(i) & "</span>. ")
Next

Og så fremdeles med andre tegn... Men det er jo frygtelig langhåret - kunne man ikke lave det smartete, så den løber igennem forskellige definerede tegn på en linje kode?
Avatar billede tuctoh Nybegynder
08. juli 2003 - 22:20 #3
hmm...

du skal måske have fat i noget regluar expressions, som desværre er noget jeg aldrig har haft mulighed for at sætte mig ind i :(
men mon ikke du kan finde en artikkel på www.4guysfromrolla.com om emnet!? Men det er en besværlig opgave at replace sådan som du ønsker...
Avatar billede lklingenberg Nybegynder
09. juli 2003 - 10:05 #4
Ja, jeg kiggede lidt på andre indlæg på eksperten, activedeveloper.dk og på 4guysfromrolla.com. Regular expression er bestemt løsningen på dette problem - og den kan også løse problemet med case sensitiviteten. Jeg vil dykke lidt ned i emnet og se hvad der dukker op ;-)
TAK for tippet - det er en håndfuld point værd synes jeg ;-)
/Lars
Avatar billede tuctoh Nybegynder
09. juli 2003 - 12:49 #5
:) tak

hvis du finder løsningen må du gerne poste den :)
Avatar billede lklingenberg Nybegynder
09. juli 2003 - 13:20 #6
Jamen, den kommer så her ;-)

Jeg opretter flg. funktion (sakset fra spm. 280626 [TAK til edutasia]):

Function HLSearchWords(strToReplace, strSearchWord)
       
  Dim objRegExpHL
  Dim strRet
  Dim Match
  Dim Matches
 
  strRet = strToReplace
 
  Set objRegExpHL = New RegExp
 
  objRegExpHL.Pattern = strSearchWord
  objRegExpHL.IgnoreCase = True
  objRegExpHL.Global = True
 
  Set Matches = objRegExpHL.Execute(strToReplace)
 
  For Each Match In Matches
    strRet = Left(strToReplace, Match.FirstIndex) & "<span style=""background-color: yellow"">"
    strRet = strRet & Match.Value & "</span>"
    strRet = strRet & Mid(strToReplace, Match.FirstIndex + Match.Length + 1)
  Next
 
  HLSearchWords = strRet
 
End Function

Derfefter bruger jeg funktionen i mit array:

For i = 0 To intArrSearchWords
  strPageDescription = HLSearchWords(strPageDescription, arrSearchWords(i))
Next
Avatar billede tuctoh Nybegynder
09. juli 2003 - 13:24 #7
smart!
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