Avatar billede reino Nybegynder
21. august 2009 - 11:39 Der er 17 kommentarer

Erstat ord til link funktion

Hej

Jeg har en lang tekststreng i en variabel som er defineret som kaldes strContent. Denne trækkes ud fra en tabel. Jeg har så en anden tabel hvor der er 2 kolonner, det ene indholder et ord, det andet en beskrivelse om dette ord.

Jeg ønsker så en funktion at når strContent udskrives bliver der checket om et ord fra den anden tabel er indholdt i denne, en slags opslagsfunktion skal jeg i princippet bruges.

Ex.

strContent='Jeg har en hest der hedder Benny'

Hvis ordet hest eksisterer i den anden tabel skal strContent laves til:

strContent='Jeg har en <a href='link'>hest</a> der hedder Benny'

Nogen der kan hjælpe her ? :)

VH / R
Avatar billede foo85 Novice
21. august 2009 - 12:20 #1
du skal bruge en funktion der hedder Replace

Den fungerer ved at tjekke en streng igennem for det ord du leder efter, og erstatter dette med det/de ord du bestemmer...

Replace(strContent, "hest", "<a href='link'>hest</a>")

Se om ikke det fikser dit problem...
Avatar billede webweaver Praktikant
21. august 2009 - 12:39 #2
Det kan laves således og jeg benytter det selv til censur på "grimme " ord fx,

Du har din while hvor du henter strContent ud. Inde i den skal du have en while mere for at checke op på om ordet eksisterer i en anden tabel.

while ($getData = mysql_fetch_array($query)) {

  $strContent = $getData['strContent'];

  $query_2 = mysql_query("SELECT word FROM words ORDER by id ASC") or die(mysql_error());

  while ($getData_2 = mysql_fetch_assoc($query_2)) {

  $word = $getData_2['word'];
  $newWord = "<a href='http://www.site.dk'>". $word . "</a>";
           
  $strContent = preg_replace("/\b" . $word . "\b/i", $newWord, $strContent);

  }

  echo $strContent;


}

Det virker og er afprøvet.
Dog vil jeg sige at du skal huske at have link med i din tabel i DB med ord, for ellers vil den jo ikke sætte et bestemt link ind til hvert ord. Hvis det skal være det samme link hver gang, er det selvføligelig ligemeget.

Husk at connecte til DB. Har jeg ikke med i eksemplet. :)
Avatar billede foo85 Novice
21. august 2009 - 12:42 #3
Det er også PHP du har gang i der...
Avatar billede webweaver Praktikant
21. august 2009 - 12:45 #4
Ahh ***, havde ikke lige set det var under ASP. Flot Lasse ;D
Well, noget i samme stil burde kunne lade sig gøre i ASP. :P
Avatar billede foo85 Novice
21. august 2009 - 12:47 #5
det kan sagtens lade sig i ASP - ingen tvivl om det...

Det er ikke noget avanceret script vi har gang i :)
Avatar billede reino Nybegynder
21. august 2009 - 13:29 #6
ok, tak for info, men skal stadigvæk bruge det i asp :)

Lige en ting mere der er væsentlig her:

I den tabel der indeholder alle ord skal scriptet tjekke om et af dísse ord indeholdes i strContent.

Det er mest databaseopslaget jeg er interesseret i, jeg bruger allerede replace :)

I princippet skal jeg vel tjekke hvetr ord i variablen strContent, tjekke om det eksisterer i "ordtabellen", hvis det gør skal det laves til et link. Men hvis jeg skal gøre dette kunne jeg forestille mig at det ville give serveren et stort load ? :)

VH /R
Avatar billede reino Nybegynder
21. august 2009 - 13:54 #7
ahh, ok, fandt ud af det, dog tror jeg scriptet er lidt belastende for serveren, så hvis nogen har et optimeret forslag hører jeg meget gerne dette :)

sql="select menu_short from ordbog"
Set RS = Conn.Execute(SQL)
If Not rs.EOF Then
    rs.MoveFirst
    Do While Not rs.EOF
strContent = replace(strContent, " " & rs("menu_short") & " ", " <b>" & rs("menu_short")  & "</b> ", 1, -1, 1)
        rs.MoveNext
    Loop
End If
Avatar billede w13 Novice
21. august 2009 - 16:20 #8
Prøv med dette.

Følgende:
  WHERE menu_short LIKE '%" & strContent & "%'
sørger for kun at vælge ord, som er indeholdt i strContent.

Dim sMenuShort
Set rs = Conn.Execute("SELECT menu_short FROM ordbog WHERE menu_short LIKE '%" & strContent & "%'")
Do While Not rs.EOF
    sMenuShort = rs("menu_short")
    strContent = replace(strContent, " " & sMenuShort & " ", " <b>" & sMenuShort  & "</b> ")
    rs.MoveNext
Loop

Bemærk dog, at fordi du også tjekker på mellemrum før og efter ordet, vil den ikke fange ordet, hvis det står først eller sidst i en sætning, eller der er et komma efter, o.lign. Måske vil den heller ikke fange det, hvis det har stort begyndelsesbogstav.
Avatar billede w13 Novice
21. august 2009 - 16:20 #9
Dog utestet. ;)
Avatar billede hifi4all Nybegynder
23. august 2009 - 16:28 #10
Måske en nemmere tilgang via et replacefilter som nedenstående?

Eksempel (tilføj så mange replaces du nu ønsker):

<%
'Filteret der erstatter ord med et link
Private Function OrdFilter(ByVal strInputEntry)

    strInputEntry = Replace(strInputEntry, "hest", "<a href=""link"">hest</a>", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "hund", "<a href=""link"">hund</a>", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "kat", "<a href=""link"">kat</a>", 1, -1, 1)

OrdFilter = strInputEntry
End Function

strContent = "Jeg har en hest der hedder Benny"
strContent = OrdFilter(strContent)

Response.Write OrdFilter
%>

Håber det kan bruges?
Avatar billede hifi4all Nybegynder
23. august 2009 - 16:31 #11
Ups, sidste line skal angives således:

Response.Write strContent

IKKE

Response.Write OrdFilter
Avatar billede webweaver Praktikant
23. august 2009 - 18:36 #12
Det er bare ikke særlig hensigts-mæssigt, hvis der er 100 ord. Og samtidig skal de smids ind manuelt. P.t. ligger de i en DB. Det faktum burde kunne udnyttes. Så skal man lave en parser som går igennem DB, laver at array med ordene i og så sætte dem ind i en replace. Det kan man sagtens jo :)
Avatar billede hifi4all Nybegynder
24. august 2009 - 07:38 #13
Der kommer selvfølgelig an på hvor mange emner der skal replaces, det fremgår ikke, som jeg ser det, af spørgsmålet.

Dit løsningsforslag kan naturligvis være vejen frem, men der skal ikke mange hits til, før serverload kan blive kritisk, hvis %LIKE% anvendes i regulære forespørgsler.
Avatar billede reino Nybegynder
24. august 2009 - 08:15 #14
Det kan være random hvor mange ord der skal replaces, ex.:

I den ene tabel er følgende tekst ex.:

Jeg har en hest der hedder Benny og en ko der hedder Kurt. En hest og ko er dejlige dyr når man bor på en bondegård...

Lad os så sige at i den anden tabel forekommer der ordene: hest, ko.

Outputtet skal der så være således:

Jeg har en <a href='link'>hest</a> der hedder Benny og en <a href='link'>ko</a> der hedder Kurt. En hest og ko er dejlige dyr når man bor på en bondegård...

Bemærk at det kun er første forekomst af ordet der skal laves om til et link, håber dette giver forståelse :)
Avatar billede webweaver Praktikant
24. august 2009 - 22:07 #15
Okay, så begynder du virkelig at gøre det tricky, hvis du kun skal erstatte ordet 1 bestemt sted i en sætning. Det ved jeg sgu ikke lige helt hvordan, eller om det overhovedet kan lade sig gøre. Måske ved at lave et array med de fundne ord, og så kun lave en replace på array[0]. Altså det først-fundne ord.

Men det må du have en ASP gut til at hjælpe dig med :)
Avatar billede hifi4all Nybegynder
25. august 2009 - 08:00 #16
Prøv at tage et kig på den viste eksempel jeg postede længere oppe!

Private Function OrdFilter(ByVal strInputEntry)

    strInputEntry = Replace(strInputEntry, "hest", "<a href=""link"">hest</a>", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "hund", "<a href=""link"">hund</a>", 1, -1, 1)
    strInputEntry = Replace(strInputEntry, "kat", "<a href=""link"">kat</a>", 1, -1, 1)

OrdFilter = strInputEntry
End Function

Hvis du så erstatter disse med:

Private Function OrdFilter(ByVal strInputEntry)

    strInputEntry = Replace(strInputEntry, "hest", "<a href=""link"">hest</a>", 1, 1, 0)
    strInputEntry = Replace(strInputEntry, "hund", "<a href=""link"">hund</a>", 1, 1, 0)
    strInputEntry = Replace(strInputEntry, "kat", "<a href=""link"">kat</a>", 1, 1, 0)

OrdFilter = strInputEntry
End Function

er det kun første forekomst der vil blive replaced.

Jeg anvender lignende på eget website, hvor en ordbog (med data fra en db) inkluderes i en artikelsektion, og viser beskrivelse for en sætning eller ord ved MouseOver...
Avatar billede w13 Novice
07. maj 2010 - 10:55 #17
Kommet videre? :)
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