webForumDet fria alternativet

Utbytesfunktion för ordlista

ASP

12 svar · 743 visningar · startad av wazid

Medlem sedan maj 2001156 inlägg
Frågan#1

Hej

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...

Tacksam för lite hjälp med utbytesfunktionen.

David

Medlem sedan juni 20019 519 inlägg
#2

Detta kan man lösa med Regular Expressions finns att läsa om detta hos http://www.webeye.nu/default2.asp?que=asp/default.asp&exec=asp/artiklar/asp_11.asp

kan tänka mig något liknande:

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

ej testad... kollade även guffa.com's script: http://www.guffa.com/Programming_archive.asp?id=13 därav pattern... tror den ska fungera nu till dig...

Medlem sedan maj 2001156 inlägg
#3

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.

help....

MvH

David

Medlem sedan jan. 2004678 inlägg
#4

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?

Medlem sedan maj 2001156 inlägg
#5

Jag har inte så många ord, så jag har inte sett någon seghet i det ännu...

En bugg är att man inte kan göra replace av ett utryck, dvs flera ord.

Jag kan allstå göra replace på "alkalisk" men inte på "alkalisk avfettning"

MvH

David

Medlem sedan jan. 2004678 inlägg
#6

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. :)

Medlem sedan dec. 20025 483 inlägg
#7

wazid skrev:

Jag har inte så många ord, så jag har inte sett någon seghet i det ännu...

En bugg är att man inte kan göra replace av ett utryck, dvs flera ord.

Jag kan allstå göra replace på "alkalisk" men inte på "alkalisk avfettning"

MvH

David

För att ersätta uttryck som "alkalisk avfettning" behöver du bara ett mönster liknande

\balkalisk avfettning\b
Medlem sedan jan. 2004678 inlägg
#8

wazids kod skrev:

objRegExp.Pattern = "\b"&ord(i)&"\b"

*visslar*

Medlem sedan jan. 2004678 inlägg
#9

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?

Medlem sedan okt. 2004392 inlägg
#10

Menar du att du kör en loop på objRegExp.Pattern = "\b"&ord(i)&"\b" och varje sån loop öppnar databasen?

Har du testat att lägga alla ord i en array?

objRegExp.Pattern = "\b"&myArray(i)&"\b"

Då går det snabbare ;)

Men jag vet inte jag kanske skriver om helt fel grej.

Medlem sedan jan. 2004678 inlägg
#11

hmm jag förstår inte riktigt vad du menar, men jag kan förklara lite tydligare vad jag försöker göra så kanske det blir lättare att fåhjälp. :)

Istället för att den letar efter ord i en ordlista så letar min funktion efter användare i en användardatabas.

Så när manskriver ett användarnamn så letar den upp användaren i databasen och skickar tillbaks användarid.

txt = Replace(txt, "<user>" & user(i) & "</user>", userid(i))

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.

Finns det någon lösning på detta?

Medlem sedan okt. 2004392 inlägg
#12

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))

Då slipper du använda databasen så mycket.

Medlem sedan jan. 2004678 inlägg
#13

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
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)