Jag vill ha en ordlista i en databas.
Där kommer jag att ha orden och så beskrivningen.
Jag vill sedan koppla denna ordlista till en valfri text som jag visar på en hemsida. Om ett ord i texten på hemsidan finns i min ordlista, så vill jag göra ordet klickbart och så kommer man till en sida där man får en förklaring på ordet.
Funktionen som jag anropar ser ut som följer
Function Lexikon(Txt)
Dim ord()
Dim conntemp2, strExec2, rstemp2
set conntemp2 = Server.CreateObject("ADODB.Connection")
conntemp2.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db/forum.mdb") & ";"
strExec2="Select Count(*) as antal From Lexikon Where status=20;"
set rstemp2=conntemp2.execute(strExec2)
Redim ord(rstemp2("antal"))
strExec2="Select Ord From Lexikon Where status=20 Order by Ord DESC;"
set rstemp2=conntemp2.execute(strExec2)
i=0
Do While Not rstemp2.eof
Ord(i)=rstemp2("Ord")
i=i+1
rstemp2.movenext
Loop
ConnTemp2.close
For i = 0 TO Ubound(ord)
Txt=Replace(Txt,ord(i), "<SPAN CLASS='lexikon'><a href='lexikon.asp?ord="&ord(i)&"'>"&ord(i)&"</a></SPAN>")
Next
Lexikon=Txt
End Function
Nu finns det en del buggar i denna.
Om jag tex har orden
bil
vax
bilvax
i ordlistan och så vill jag presentera följande text
"jag vaxar min bil med bilvax."
Jag får då de tre första bokstäverna i vaxar som en länk till ordlistans vax. Det vill jag inte. Jag vill bara få rena träffar(på vax, Vax och vax.)
VIdare så blir ordet bilvax till två länkar, en till bil och en till vax.
Trots att ordet bilvax finns i ordlistan blir det ingen länk...
strExec2="Select Ord From Lexikon Where status=20 Order by Ord DESC;"
set rstemp2=conntemp2.execute(strExec2)
Do While Not rstemp2.eof
Ord = rstemp2("Ord") &"|"
rstemp2.movenext
Loop
ConnTemp2.close
Function lexikon(str)
Set objRegExp = New regexp
objRegExp.Global = true
objRegExp.IgnoreCase = true
objRegExp.MultiLine = True
.Pattern = "(^|\W)(" &ord &")(?=$|\W)"
Highlight = .Replace(strText,"$1<SPAN CLASS='lexikon'><a href='lexikon.asp?ord=$2'>$2</a></SPAN>")
lexikon = str
end function
Tackar för tipsen.
nu fungerar det med avseende på de önskemål jag hade...
Function Lexikon(Txt)
Dim objRegExp, strReplace
Set objRegExp = New regexp
objRegExp.Global = true
objRegExp.IgnoreCase = true
objRegExp.MultiLine = True
Dim ord()
Dim conntemp2, strExec2, rstemp2
set conntemp2 = Server.CreateObject("ADODB.Connection")
conntemp2.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db/forum.mdb") & ";"
strExec2="Select Count(*) as antal From Lexikon Where status=20;"
set rstemp2=conntemp2.execute(strExec2)
Redim ord(rstemp2("antal"))
strExec2="Select Ord From Lexikon Where status=20 Order by Len(Ord) DESC;"
set rstemp2=conntemp2.execute(strExec2)
i=0
Do While Not rstemp2.eof
Ord(i)=rstemp2("Ord")
i=i+1
rstemp2.movenext
Loop
ConnTemp2.close
For i = 0 TO Ubound(ord)-1
objRegExp.Pattern = "\b"&ord(i)&"\b"
strReplace = "<a href='lexikon.asp?ord="&ord(i)&"'>"&ord(i)&"</a>"
txt=objRegExp.Replace(Txt, "<b>"&strReplace&"</b>")
Next
Lexikon=Txt
End Function
Dock har jag upptäckt att jag nu får problem med å,ä och ö.
Vidare så kör det ihop sig om jag i ordlistan har både tex
avfettning och alkalisk avfettning.
Då kolliderar det. Skulle vilja att jag bara fick en match på
"alkalisk avfettning" om det är det som står i texten, men om det står "vanlig avfettning" så ska träffen ges på avfettning.
Oj, den här tråden innehåller lösningen på ett problem jag haft i typ ett och ett halvt år... Jag har haft svårt att sova nästan pga det.
Fast jag vill ha det i asp.net.. men förstår jag koden rätt så går det nog att lösa lätt..
Är det så att du fyller en array med aaaalla ord i ordlistan, letar efter just ord från arrayen i texten och replacar med länken?
Om jag nu tolkat detta rätt. kan man då skapa en till array som innehåller nån annan info som ligger bredvid ordet i databasen och replaca det som finns i arrayen med det som finns i andra arrayen?
och slutligen, om jag fortfarande förstått rätt, gör inte det här att sidan blir jätteseg? om ordlistan innehåller 2000 ord så måste den ju slänga in alla dom först och sen leta igenom för varje.. segar inte det ner?
okej. jag tänkte köra en timer på för att få en siffra på om det blir segt.
okej, jag tänkte inte använda det riktigt på samma sätt, så jag kan sätta något framför och bakom för att markera när ordet börjar och slutar, så det borde inte vara något problem.
men innan har jag försökt köra en replace och en regexp direkt och inte fått det att funka.. så jag är optimistisk och hoppas att det ska gå.. men det är lite klurigt att göra om det till asp.net. fast jag tror att jag förstår vad du gör i din kod. så det ska nog lösa sig. :)
ehm, om jag kör en funktion på outputen.. dvs det den hittade i kodexemplet från ovan
ord(i)
så blir sidan jääääätteseg. det tar ca 0,1 sekund att skriva ut orden som den hittar från databasen trots att den letar igenom 3000. men det tar över en minut om jag väljer att köra en funktion på ord(i). Den funktionen använder också databasen, kan det vara ett problem?
Eller det är nog problemet, men hur kan jag komma runt det?
jag har altså använt mig av två arrays, en som innehåller användarnamnet och en som innehåller användaridt. Sedan letar den efter användarnamnet innanför <user></user> och skickar tillbaks användarid. Detta fungerar aldelles utmärkt och det går jättesnabbt.
Nu vill jag använda det här idnumret i en funktion som jag redan har. En funktion som utifrån användarid hämtar saker som födelsedatum, postnummer, kön osv. Sedan stoppas allt in lite snyggt i en länk till användarens sida och när man håller över länken så ser man ålder, kön och ort. Men det tycks bli vääääldigt segt när jag kör den här funktionen på useridt, och det verkar bero på att det ligger databaskopplingar i det.
Tiden ökar från 0,1 sekund till mellan 60 och 90 sekunder när jag hämtar info från användaridt.
Du har alltså två Arrays... en med namn en med ID...
Gör så här istället:
När du hämtar alla användare så gör du en array som ser ut så här:
Array(ID => Array(Namn,Ålder,Kön,Ort), ID => Array(Namn,Ålder,Kön,Ort))
Förstår du vad jag menar?
Alltså du lägger datan om användaren i en och samma Array.
Eller så kan du ha kvar ID arrayn och byta Namn arrayn till En Array så här:
Array(Array(Namn,Ålder,Kön,Ort),Array(Namn,Ålder,Kön,Ort))
Mjo, jag tänkte lite på det också, och det skulle ju kunna funka. Men sen är det så att orten står i Postnummerform, och då behöver jag gå in i databasen och leta reda på ortnamnet för postnumret.. och den databaskopplingen är tillräckligt mycket för att sega ner scriptet.. och jag vet inte hur smidigt det vore att fixa arrays där också.. det börjar bli ganska många arrays då.. :/
267 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e