Avatar billede lund_dk Praktikant
20. juni 2006 - 14:12 Der er 37 kommentarer og
1 løsning

Replace function

Har et community, hvor beskeder kører igennem replace funktioner med smileys, badword m.m.

Jeg vil så lave en replace funktion der går ind gå ind og laver et brugernavn om til link

Hvis en bruger skriver [brugernavn] skal dette er erstattes med link til den pågældende bruger (eks bruger.asp?User=brugernavn)
Hvordan fikser jeg det, når den IKKE skal lave replace bare nårman skriver brugernavn, men først når der står [brugernavn]
Avatar billede lund_dk Praktikant
20. juni 2006 - 14:15 #1
Her hvordan en af mine replaces functions ser ud,

Function FontWeight(strContent)
    strContent = replace(strContent,"","<b>",1,-1,1)
    strContent = replace(strContent,"
","</b>",1,-1,1)
    strContent = replace(strContent,"","<i>",1,-1,1)
    strContent = replace(strContent,"
","</i>",1,-1,1)
    strContent = replace(strContent,"","<u>",1,-1,1)
    strContent = replace(strContent,"
","</u>",1,-1,1)
    strContent = replace(strContent, vbcrlf, "<br>")
    FontWeight = strContent
End Function
Avatar billede tjaz Nybegynder
20. juni 2006 - 17:48 #2
jeg skal lige forstå det rigtigt.

Du vil have at den skal ændre et brugernavn til et brugernavn med link, hvis en bruger f.eks. skriver [tjaz] og ikke så den bare erstatter det hvis man skriver tjaz rent?
Avatar billede lund_dk Praktikant
20. juni 2006 - 17:53 #3
Nemlig..
Avatar billede tjaz Nybegynder
20. juni 2006 - 18:03 #4
okay, prøv det her:

Function nyTekst(tekst)
'Først splitter vi teksten op så vi kan tjekke hvert enkelt ord
arrTekst = Split(tekst, " ")

'Så skal vi have testet hvert ord
For t = LBound(addTekst) to UBound(arrTekst)

  'Først tjekker vi om hvert enkelt ord starter OG slutter med henholdsvis [ og ]
  if left(arrTekst(t), 1) = "[" AND right(arrTekst(t), 1) = "]" then

  'Hvis der er det fjerne vi [ og ] så vi kan tjekke databasen for ordet
  arrTekst(t) = replace(arrTekst(t), "[", "")
  arrTekst(t) = replace(arrTekst(t), "]", "")

  'Det er så her vi skal have fat i din database for at se om der er en bruger der passer til ordet
  strSQL = "SELECT * FROM brugere WHERE username = '"& arrTekst(t) &"'"
  set rs = Conn.Execute(strSQL)

  'Hvis vi finder et brugernavn som passer erstatter vi det med et link
  if not rs.eof then
    'Hvis vi finder det erstatter vi det enkelte ord med et link + ordet ofc.
    arrTekst(t) = "<a href="ditlink.asp">"& arrTekst(t) &"</a>"
  else
    'Hvis ikke skal vi bare bruge ordet alene, hvor vi sætter [ og ] tilbage
    'så brugeren evt kan se at han har stavet forkert
    arrTekst(t) = "["& arrTekst(t) &"]"
  end if

  end if

  'Herefter smider vi det igennem din egen replace funktion
  arrTekst(t) = FontWeight(arrTekst(t))

  'Så sætter vi teksten sammen igen (husk mellemrummet som vi før brugte til at splite den ad)
  nyTekst = nyTekst & arrTekst(t) &" "

Next
End Fuction


'Du kan nu udskrive det hele
response.write nyTekst(rs("tekst"))
Avatar billede tjaz Nybegynder
20. juni 2006 - 18:04 #5
rettelse -> End Function :)
Avatar billede tjaz Nybegynder
20. juni 2006 - 18:14 #6
Noget der virker ?
Avatar billede lund_dk Praktikant
20. juni 2006 - 18:47 #7
Linie:
For t = LBound(addTekst) to UBound(arrTekst)

Giver fejl:
Microsoft VBScript runtime error '800a000d'

Type mismatch: 'LBound'
Avatar billede nielle Nybegynder
20. juni 2006 - 18:56 #8
Hvorfor ikke bare gøre det helt simpelt:

Function FontWeight(strContent)
    strContent = replace(strContent,"","<b>",1,-1,1)
    strContent = replace(strContent,"
","</b>",1,-1,1)
    strContent = replace(strContent,"","<i>",1,-1,1)
    strContent = replace(strContent,"
","</i>",1,-1,1)
    strContent = replace(strContent,"","<u>",1,-1,1)
    strContent = replace(strContent,"
","</u>",1,-1,1)
    strContent = replace(strContent, vbcrlf, "<br>")

    strSQL = "SELECT brugerNavn FROM brugere WHERE username = '"& arrTekst(t) &"'"
    Set rs = Conn.Execute(strSQL)

    Do While Not rs.EoF
        brugerNavn = rs["brugerNavn"]

        fra = "[" & brugerNavn & "]"
        til = "<a href='bruger.asp?User=" & brugerNavn & "'>" & brugerNavn & "</a>"
        strContent = replace(strContent, fra, til)

        rs.MoveNext
    Loop

    FontWeight = strContent
End Function
Avatar billede nielle Nybegynder
20. juni 2006 - 19:00 #9
Rettet 2 fejl:

Function FontWeight(strContent)
    strContent = replace(strContent,"","<b>",1,-1,1)
    strContent = replace(strContent,"
","</b>",1,-1,1)
    strContent = replace(strContent,"","<i>",1,-1,1)
    strContent = replace(strContent,"
","</i>",1,-1,1)
    strContent = replace(strContent,"","<u>",1,-1,1)
    strContent = replace(strContent,"
","</u>",1,-1,1)
    strContent = replace(strContent, vbcrlf, "<br>")

    strSQL = "SELECT brugerNavn FROM brugere"
    Set rs = Conn.Execute(strSQL)

    Do While Not rs.EoF
        brugerNavn = rs("brugerNavn")

        fra = "[" & brugerNavn & "]"
        til = "<a href='bruger.asp?User=" & brugerNavn & "'>" & brugerNavn & "</a>"
        strContent = replace(strContent, fra, til)

        rs.MoveNext
    Loop

    FontWeight = strContent
End Function
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:02 #10
Får jeg fejlen

Microsoft VBScript runtime error '800a000d'

Type mismatch: 'arrTekst'
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:03 #11
prøvede den anden du lige skrev, og rettet til med mine oplysninger i database,men den erstatter intet..
Avatar billede tjaz Nybegynder
20. juni 2006 - 19:05 #12
ret:
For t = LBound(addTekst) to UBound(arrTekst)

til:
For t = LBound(arrTekst) to UBound(arrTekst)
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:05 #13
Jo gør den da nu, den tager bare ikke højde for store og små bogstaver, hvordan gør jeg det?

Så hvis brugernavnet databasen er Lund, og jeg skriver lund med lille L, så finder den ikke min bruger?
Avatar billede tjaz Nybegynder
20. juni 2006 - 19:10 #14
går du ud fra min eller nielle's nu ?
Avatar billede madeindk Nybegynder
20. juni 2006 - 19:10 #15
Function FontWeight(strContent)
    strContent = replace(strContent,"","<b>",1,-1,1)
    strContent = replace(strContent,"
","</b>",1,-1,1)
    strContent = replace(strContent,"","<i>",1,-1,1)
    strContent = replace(strContent,"
","</i>",1,-1,1)
    strContent = replace(strContent,"","<u>",1,-1,1)
    strContent = replace(strContent,"
","</u>",1,-1,1)
    strContent = replace(strContent, vbcrlf, "<br>")

    strSQL = "SELECT lCase(brugernavn) FROM brugere"
    Set rs = Conn.Execute(strSQL)

    Do While Not rs.EoF
        brugerNavn = lCase(rs("brugernavn"))

        fra = "[" & brugerNavn & "]"
        til = "<a href='bruger.asp?User=" & brugerNavn & "'>" & brugerNavn & "</a>"
        strContent = replace(strContent, fra, til)

        rs.MoveNext
    Loop

    FontWeight = strContent
End Function
Avatar billede tjaz Nybegynder
20. juni 2006 - 19:12 #16
men det primære i det uanset hvilken en af du bruger er, at du får den til at sammenligne med f.eks. lcase()
Avatar billede nielle Nybegynder
20. juni 2006 - 19:13 #17
Der er nu ikke brug for to gange LCase :^)

Den i SQL-sætningen burde være nok.
Avatar billede madeindk Nybegynder
20. juni 2006 - 19:14 #18
Nå ja ok - men bare for at være på den sikre side tænkte jeg :-)
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:16 #19
madeindk: Så vil den ikke tage imod
brugerNavn = lCase(rs("brugernavn"))

ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

/functions.asp, line 212

erstatter brugernavn med username, da mit felt i i databasen er username, så nu ser min kode sådan her ud:

Function FontWeight(strContent)
    strContent = replace(strContent,"","<b>",1,-1,1)
    strContent = replace(strContent,"
","</b>",1,-1,1)
    strContent = replace(strContent,"","<i>",1,-1,1)
    strContent = replace(strContent,"
","</i>",1,-1,1)
    strContent = replace(strContent,"[u]","<u>",1,-1,1)
    strContent = replace(strContent, vbcrlf, "<br>")
   
    strSQL = "SELECT lCase(username) FROM users"
    Set rs = Conn.Execute(strSQL)

    Do While Not rs.EoF
        brugerNavn = lCase(rs("username"))

        fra = "[" & brugerNavn & "]"
        til = "<a href='./?S=6&M=Profile&ID=" & rs("ID") & "'>" & rs("username") & "</a>"
        strContent = replace(strContent, fra, til)

        rs.MoveNext
    Loop
    FontWeight = strContent
End Function
Avatar billede madeindk Nybegynder
20. juni 2006 - 19:17 #20
Vi har også lige talt om den første lCase var nok - så bare ret:

fra:
brugerNavn = lCase(rs("username"))

til:
brugerNavn = rs("username")
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:18 #21
jep, men stadig det samme med denne kode

Function FontWeight(strContent)
    strContent = replace(strContent,"","<b>",1,-1,1)
    strContent = replace(strContent,"
","</b>",1,-1,1)
    strContent = replace(strContent,"","<i>",1,-1,1)
    strContent = replace(strContent,"
","</i>",1,-1,1)
    strContent = replace(strContent,"[u]","<u>",1,-1,1)
    strContent = replace(strContent, vbcrlf, "<br>")
   
    strSQL = "SELECT lCase(username),id FROM users"
    Set rs = Conn.Execute(strSQL)

    Do While Not rs.EoF
        brugerNavn = rs("username")

        fra = "[" & brugerNavn & "]"
        til = "<a href='./?S=6&M=Profile&ID=" & rs("ID") & "'>" & rs("username") & "</a>"
        strContent = replace(strContent, fra, til)

        rs.MoveNext
    Loop
    FontWeight = strContent
End Function
Avatar billede nielle Nybegynder
20. juni 2006 - 19:20 #22
Hvis brugernavnet senere skal bruges til at hent ud fra databasen igen, så er det nok vigtigt at beholde casen der hvor det er muligt:

Function FontWeight(strContent)
    strContent = replace(strContent,"","<b>",1,-1,1)
    strContent = replace(strContent,"
","</b>",1,-1,1)
    strContent = replace(strContent,"","<i>",1,-1,1)
    strContent = replace(strContent,"
","</i>",1,-1,1)
    strContent = replace(strContent,"","<u>",1,-1,1)
    strContent = replace(strContent,"
","</u>",1,-1,1)
    strContent = replace(strContent, vbcrlf, "<br>")

    strSQL = "SELECT brugerNavn FROM brugere"
    Set rs = Conn.Execute(strSQL)

    Do While Not rs.EoF
            brugerNavn = rs("brugerNavn")

        fra = "[" & LCase(brugerNavn) & "]"
        til = "<a href='bruger.asp?User=" & brugerNavn & "'>" & brugerNavn & "</a>"
        strContent = replace(strContent, fra, til)

        rs.MoveNext
    Loop

    FontWeight = strContent
End Function
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:21 #23
nielle: Jo men så får jeg jo udskrevet brugernavnet i Lowcase? Og det vil jeg ikke..
Avatar billede nielle Nybegynder
20. juni 2006 - 19:22 #24
Øhh, nej da. Det gør du ikke.

Eller også misforstår jeg hvad du mener?
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:23 #25
men uanset hvad, får jeg denne fejl

ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

/functions.asp, line 212


linie 212 er
brugerNavn = rs("username")
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:25 #26
Så min kode skal se sådan her ud nu, eller er jeg gal på den?

strSQL = "SELECT username,id FROM users"
    Set rs = Conn.Execute(strSQL)

    Do While Not rs.EoF
        brugerNavn = rs("username")

        fra = "[" & LCase(brugerNavn) & "]"
        til = "<a href='./?S=6&M=Profile&ID=" & rs("ID") & "'>" & brugernavn & "</a>"
        strContent = replace(strContent, fra, til)

        rs.MoveNext
    Loop
Avatar billede nielle Nybegynder
20. juni 2006 - 19:26 #27
Den fejl lyder som om at der ikke er noget felt som hedder "username" i din "users" tabel.
Avatar billede nielle Nybegynder
20. juni 2006 - 19:27 #28
20/06-2006 19:25:53> Ser rigtig ud.
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:27 #29
Det er der, tager jeg ovenstående kode jeg lige har sendt, så virker der fint..
Når jeg smider lCase(username)  i sql sætningen, er det den siger der ikke noget der hedder username .. meeeen som sagt, det er der..
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:28 #30
Kommentar: nielle 20/06-2006 19:27:26: den viker NÆSTEN også.. MEN igen, skriver jeg LunD og brugrnavet hedder Lund i Databasen, så replacer den ikke..
Avatar billede nielle Nybegynder
20. juni 2006 - 19:31 #31
Men hvorfor ønsker du da også at kunne skrive [LunD] i din tekst?

Du tillader jo f.eks. ikke at man skriver [B] i stedet for [b].
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:34 #32
Funktionen her
strContent = replace(strContent,"[b]","<b>",1,-1,1)
Gør at den er ligeglad om du skriver [B] eller [b] så erstatter den alligevel..

Jeg ønsker det da jeg har et community hvor der ikke er en chance for at vide om en bruger hedder lund eller Lund , så ville der være rart med en replace som tagr højde for det.
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:35 #33
men ellers,så lad os gøre det på en anden måde, at lade være med at tjekke i db.
og så bare sige

skriver en bruger [lund] så skal jeg have link med ./?S=6&M=Profile&username=lund
Avatar billede nielle Nybegynder
20. juni 2006 - 19:40 #34
Er det så ikke bare at rette:

strContent = replace(strContent, fra, til)

- til:

strContent = replace(strContent, fra, til, 1, -1, 1)
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:42 #35
Jo selvfølgelig,og det virker ;)
Avatar billede nielle Nybegynder
20. juni 2006 - 19:45 #36
... og så dropper vi helt brugen af LCase():

strSQL = "SELECT username, id FROM users"
Set rs = Conn.Execute(strSQL)

Do While Not rs.EoF
    username = rs("username")

    fra = "[" & username & "]"
    til = "<a href='./?S=6&M=Profile&ID=" & rs("ID") & "'>" & brugernavn & "</a>"
    strContent = replace(strContent, fra, til, 1, -1, 1)

    rs.MoveNext
Loop
Avatar billede lund_dk Praktikant
20. juni 2006 - 19:46 #37
yes nemlig..
smid du et svar..
Avatar billede nielle Nybegynder
20. juni 2006 - 19:47 #38
'så gerne :^)
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