Avatar billede osaka_san Nybegynder
06. januar 2002 - 15:31 Der er 25 kommentarer og
2 løsninger

Konvertering af hyperlinks i Streng

Hejsa Folkens.

Er der nogen af jer der ligger inde med eller kan hjælpe med en vb.net funktion der konverterer hyperlinks og email adresser i en streng til klikbare links i HTML format?

Erhver form for hjælp er velkommen, da jeg er lidt på bar bund.

De Bedste Hilsner
Oscar Eg Gensmann
Avatar billede kedde65 Praktikant
06. januar 2002 - 15:34 #1
ØHHH, kan du ikke lige specificere det lidt?
Avatar billede osaka_san Nybegynder
06. januar 2002 - 15:44 #2
kedde65> Jeg kan da prøve :-)

Jeg har behov for en funktion eller hjælp til en funktion der tager en streng der f.eks indeholder:

TextString = \"besøg websitet på denne adresse http://www.mydomaine.com or email me at test@test.com\"

Funktionen skal så identificere linket og email adressen og konvertere stringen:

TextString = Convertlinks(TextString)

Resultatet bliver så:

besøg websitet på denne adresse <a href=\"http://www.mydomaine.com\">http://www.mydomaine.com</a> or email me at <a href=\"test@test.com\">test@test.com</a>

Der findes nogle stykker til den slags i normal asp (vbscript), men jeg leder efter en tilsvarende i vb.net.

Med Venlig Hilsen
Oscar Eg Gensmann
Avatar billede osaka_san Nybegynder
06. januar 2002 - 15:45 #3
Du ser den rent faktisk en lign. i brug her på Eksperten.dk :-)
Avatar billede odegaard Nybegynder
06. januar 2002 - 15:46 #4
du kan jo blot søge efter strengen www. eller http:// ord for ord, og så indsætte
\"<a href=\'\" & ord & \"\'>\" & ord & \"</a>\"
istedet for det fundne ord som indeholder ovennævnte søgestreng.
Det samme hvis ordet indeholder et \'@\' og der er bogstaver før og efter @\'et og mindst ét punktum efter @ og mindst to bogstaver efter dette punktum.

Jeg ved godt det ikke er en komplet kodestrimmel, men det er nu en rimelig logisk opbygning, og rimelig nemt at lave.

/Odegaard
Avatar billede odegaard Nybegynder
06. januar 2002 - 15:47 #5
Var det ikke nemmere at oversætte den til ASP ? Det er nu ikke de store ændringer der skal til.

/Odegaard
Avatar billede odegaard Nybegynder
06. januar 2002 - 15:48 #6
øh undskyld, FRA asp :-)
Avatar billede osaka_san Nybegynder
06. januar 2002 - 15:57 #7
well mit problem ligger primært i at streng manipulation ikke er min specielt stærke side og så ville jeg lige tjekke om der eventuelt var nogen der havde rodet med det i forvejen. Det er det der med at opfinde den dybe tallerken to gange :)

Derudover kunne det jo tænkes der var nogle nye metoder i .net som jeg ikke var bekendt med der kunne gøre det enklere end det gøres i traditionel asp som ved en oversættelse stort set ville blive det samme og ikke udnytte evt nye funktionaliter :-)

/Oscar Eg GEnsmann
Avatar billede kedde65 Praktikant
06. januar 2002 - 15:59 #8
Du kan uden problemer sætte dit gamle asp kode ind i din asp.net application.
Mere eller mindre alt det gamle er stadig brugbart.
Jeg kigger lige på det!

Kedde
Avatar billede nute Nybegynder
06. januar 2002 - 16:08 #9
Jeg er helt på bar bakke når det gjelder .net, men prinsipielt kan jeg da hjelpe, for løsningen er da rimelig global :-)

når det gjelder URL\'er, så skal det være rimelig simpelt (gjøres ved parsing):

1) finn enhver \'http://\' delstreng
2) sjekk at det ikke allerede lligger en <a> rundt om denne adresse
3) finn første space etter \'http://\'

Du vil nå sitte med to tallverdier: en for ved hvilken index i strengen \'http://\' først opptrer og en for ved hvilken index det første mellomrom er *etter* \'http://\'

4) trekk ut delstrengen som ligger mellom disse verdiene
5) legg inn \"<a href=\"[delstreng]\">[delstreng]</a>\" der som adressen ligger

alternativt kan dette løses med Regular Expressions

når det gjelder mailadresse, så er den litt mer vrien...meeen, det kan vel løses på *nesten* samme måte. Det eneste du skal gjøre ekstra (hvis du ikke benytter reg exp) er å sjekke om det er mellomrom før eller etter @ (som er det tegn du søker etter)

/nute
Avatar billede osaka_san Nybegynder
06. januar 2002 - 16:17 #10
kedde65> det er jeg klar over, men jge ønsker helst ikke en hurtig løsning, men en løsning der er baseret på de nye .net objekter.

Årsagen er at jeg skal bruge det til et standard library til lidt forskellige sites jeg sysler med og vil derfor gerne have \"pæn\" kode i stedet for snippets fra forskellige sprog :-)

Med Venlig Hilsen
Oscar Eg GEnsmann
Avatar billede kedde65 Praktikant
06. januar 2002 - 16:24 #11
Okay, men jeg er også igang med det :-)) Jeg sidder alligevel og roder med .net platformen.
Avatar billede kedde65 Praktikant
06. januar 2002 - 17:08 #12
Her kommer der en ordentlig spandfuld kode. Det ordner den del med en link, jeg vil(dog uden at have prøvet) at det kan gøres ligesådan med din mail adresse.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim str As String
        Dim var As Integer
        Dim var2 As Integer
        Dim StartStreng As String
        Dim SlutStreng As String
        Dim Link As String
        str = \"Du kan besøge eksperternes websted på http://www.eksperten.dk her kan du finde ......\"

        var = str.IndexOf(\"http://\")
        var2 = str.IndexOf(\" \", var)
        Try
            Link = str.Substring(var, var2 - var)
            StartStreng = str.Substring(0, var)
            SlutStreng = str.Substring(var + Link.Length, str.Length - StartStreng.Length - Link.Length)
            Link = \"<a href=\" & Link & \">\" & Link & \"</a>\"


            Response.Write(StartStreng & Link & SlutStreng)

        Catch sd As Exception
            Response.Write(sd.ToString)
        End Try

    End Sub
Avatar billede odegaard Nybegynder
06. januar 2002 - 17:22 #13
måske skulle man også tilføje muligheden for at folk blot skriver \"www.\"
...og så selv tilhøje http:// til selve linket (men ikke teksten i sig selv).
Avatar billede kedde65 Praktikant
06. januar 2002 - 17:23 #14
Ja, men det er det man kalder finpusning!! Denne metode er bestemt ikke skudsikker, men den virker da til at starte med.
Kedde
Avatar billede odegaard Nybegynder
06. januar 2002 - 17:25 #15
Det var jo bare det at han ville ha\' pæn kode, så jeg foreslog jo lige en af de ekstra ting der burde være :-)
Avatar billede kedde65 Praktikant
06. januar 2002 - 17:28 #16
Hvad nu iøvrigt hvis man skal på eksperten.dk der er der ikke noget www eller http:// men linket virker alligevel, når man skriver det i browseren! Jeg synes egentligt det må være rimeligt at kræve at brugeren skriver http:// foran.

Det er de fleste brugere allivel også vant til.

Kedde
Avatar billede osaka_san Nybegynder
06. januar 2002 - 17:35 #17
kedde65

jeg har forsøgt at lege lidt med dit eksempel, men får en:

error BC30519: No accessible overloaded
\'IndexOf\' can be called without a narrowing conversion. Specific diagnoses foll
ow:
    For overload candidate \'Public Function IndexOf(value As String, startIndex
As Integer) As Integer\': The argument matching parameter \'startIndex\' narrows fr
om type \'String\' to type \'Integer\'.
    For overload candidate \'Public Function IndexOf(value As Char, startIndex As
Integer) As Integer\': The argument matching parameter \'value\' narrows from type
\'String\' to type \'Char\'.
    For overload candidate \'Public Function IndexOf(value As Char, startIndex As
Integer) As Integer\': The argument matching parameter \'startIndex\' narrows from
type \'String\' to type \'Integer\'.

                                var2 = input.IndexOf(\" \", var)
                                          ~~~~~~~~~~~~~~~~~~~~~~~~~

når jeg kompiler min dll?

Det skal dog for en god ordens skyld siges at jeg p.t. også  har en bekendt til at kigge på en RegExp løsning (uden for eksperten.dk regi), om det lykkedes skal jeg ikke kunne sige :-)

Mvh.
Oscar Eg Gensmann
Avatar billede osaka_san Nybegynder
06. januar 2002 - 17:39 #18
Hmm kopierede lige koden igen og nu ville den godt compile. dog får jeg nu en:

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: startIndex

hvis strengen ikke indeholder et link og:

dkSystem.ArgumentOutOfRangeException: Length cannot be less than zero. Parameter name: length at System.String.Substring(Int32 startIndex, Int32 length)

hvis den indeholder et link
Avatar billede odegaard Nybegynder
06. januar 2002 - 17:39 #19
Kedde: De fleste adresser har www., og mange \"simple\" brugere aner ikke hvad http:// er.
Du kan selvfølgelig ikke gætte en URL, uden hverken http:// eller www.
Jeg vil mene at man oftest vil bruge http:// når der netop ikke er www. foran (ellers gider man da ikke skrive det).

Test: www.eksperten.dk
Avatar billede kedde65 Praktikant
06. januar 2002 - 17:39 #20
hva er input i den streng?

var2 = input.IndexOf(\" \", var)

Kedde
Avatar billede odegaard Nybegynder
06. januar 2002 - 17:41 #21
hehe... Selv Eksperten kan nøjes med www :-)
Avatar billede kedde65 Praktikant
06. januar 2002 - 17:46 #22
Ja okay, odegaard. Det er iorden, man kan selvfølgelig ligeså godt tage den med, når nu man alligevel er igang.´

Osaka_san>> Du kan jo teste på om var er -1 for hvis dette er tilfældet, så er der ingen link i strengen.
Avatar billede osaka_san Nybegynder
06. januar 2002 - 18:03 #23
kedde65> det er selvfølgelig rigtig nok.

Jeg er dog selv gået igang med at kigge lidt på en regex mulighed baseret på nogle eksempler i .NET dokumentationen, så jeg tillader mig lige at holde spørgsmålet åbent lidt endnu inden der deles point ud :-), i tilfælde af at nogen skulle have en god ide i RegEx retningen. :-)

/Oscar
Avatar billede odegaard Nybegynder
06. januar 2002 - 18:38 #24
Prøv den her (kilde: http://www.4guysfromrolla.com/webtech/061399-3.shtml)

<script language=\"javascript1.2\" runat=server>
function edit_hrefs(s_html){
    // use regular expressions to look for
    // e_mail addresses and urls
    s_str = new String(s_html);

    s_str = s_str.replace(/\\bhttp\\:\\/\\/www(\\.[\\w+\\.\\:\\/\\_]+)/gi,
        \"http\\:\\/\\/¬¤¸$1\");

    s_str = s_str.replace(/\\b(http\\:\\/\\/\\w+\\.[\\w+\\.\\:\\/\\_]+)/gi,
        \"<a href=\\\"$1\\\">$1<\\/a>\");
       
    s_str = s_str.replace(/\\b(www\\.[\\w+\\.\\:\\/\\_]+)/gi,
        \"<a href=\\\"http://$1\\\">$1</a>\");
       
    s_str = s_str.replace(/\\bhttp\\:\\/\\/¬¤¸(\\.[\\w+\\.\\:\\/\\_]+)/gi,
        \"<a href=\\\"http\\:\\/\\/www$1\\\">http\\:\\/\\/www$1</a>\");
       
    s_str = s_str.replace(/\\b(\\w+@[\\w+\\.?]*)/gi,
        \"<a href=\\\"mailto\\:$1\\\">$1</a>\");
       
   
    return s_str;
}
</script>
Avatar billede osaka_san Nybegynder
06. januar 2002 - 22:25 #25
Ja, efter en del timers fislen rundt, tror jeg det er lykkedes mig selv at komme op med en indtil videre nogenlunde løsning:

-----------------------
\' Convert links and email adresses in string to clickable HTML.
Public Function DoLinks(InputString as String) as String                   
Dim WorkString as StringBuilder = new StringBuilder(InputString)                       
Dim rwww, remail, rhttp As Regex           
Dim m As Match

rhttp = New Regex(\"(?i)(http://)(\\S)+\\b\")
rwww = New Regex(\"(?i)\\s(www.)(\\S)+\\b\")
remail = New Regex(\"\\b(\\S+@\\S+)\\b\")                                       
WorkString.Insert(0, \" \")

m = rwww.Match(WorkString.ToString())
While m.Success
WorkString.Replace(m.value.trim(), \"http://\"& m.Value.trim())                       
m = m.NextMatch()                                           
End While

m = rhttp.Match(WorkString.ToString())
While m.Success
WorkString.Replace(m.value, \"<a href=\"\"\"& m.Value &\"\"\">\"& m.Value &\"</a>\")                       
m = m.NextMatch()                                           
End While

m = remail.Match(WorkString.ToString())
While m.Success
WorkString.Replace(m.value, \"<a href=\"\"mailto:\"& m.Value &\"\"\">\"& m.Value &\"</a>\")                       
m = m.NextMatch()                                           
End While

WorkString.Remove(0,1)
Return WorkString.Tostring()                                           
End Function

---------------------
Så jeg tilladermig at være flabet og nuppe mine point selv :-)

Med Venlig Hilsen
Oscar Eg Gensmann
Avatar billede odegaard Nybegynder
06. januar 2002 - 23:50 #26
Forsøgte du \"mit\" eksempel ?
Jeg kunne godt lide at vide om det er en funktionel løsning.
Avatar billede osaka_san Nybegynder
07. januar 2002 - 13:59 #27
Odegaard>

Jeg kiggede lidt på den artikel og fik en ide eller 2 derfra. Jeg brugte ikke den reelle givne løsning, men idden med først at give adresser som www.eksperten.dk en http:// foran med RegEx for derefter at køre endnu en RegEx på adresser med http:// var ganske brugbar og også den som mit resultat er baseret på.

Det skal dog siges at jeg fandt nogle huller i den kode der er postet her som jeg har rettet til, men de var primært i forbindelse med en udbyggelse af nogle andre parser funktioner, så de burde ikke spille specielt ind.

Med Venlig Hilsen
Oscar Eg Gensmann
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