Avatar billede jaffafo Nybegynder
09. september 2004 - 02:48 Der er 26 kommentarer og
2 løsninger

automatisk lave http:/ til link i string

Hej

Jeg henter data ud af min db og smider det i en label. Før den gør det vil jeg gerne have lavet f.eks. http://www.yahoo.com/ til et link. dvs den skal tjekke efter Http:// og lave det og resten af ordet til et link.

pseudo kode:

Hvis "http://" findes i stringen skal http:// + resten af ordet erstattes med:

<a href=http://www.yahoo.com>http://www.yahoo.com/</a>


hvordan gør jeg det?
Avatar billede snepnet Nybegynder
09. september 2004 - 08:07 #1
hej jaffafo :o)

kan du ikke lave det lige ud af landevejen sådan her :

// værdien someText er så noget du på en eller anden måde suger fra basen :
// jeg regner også med at du smider din label ind i someContainer

if(someText.IndexOf("http://") != -1)
{
  HyperLink hl = new HyperLink();
  hl.NavigateUrl = someText;
  hl.Text = someText;
  someContainer.Controls.Add(hl);
}
else
{
  Label l = new Label();
  l.Text = someText;
  someContainer.Controls.Add(l);
}
Avatar billede jaffafo Nybegynder
09. september 2004 - 13:21 #2
Jo det ville nok virke, men hvad nu hvis string'en består af en meget lang tekst? Det er jo kun http://... som skal være link.
Avatar billede jaffafo Nybegynder
09. september 2004 - 13:22 #3
som du kan se har eksperten lavet sådan noget :)
Avatar billede snepnet Nybegynder
09. september 2004 - 13:48 #4
du kan jo tage den frem til første mellemrum med
s.Split(' ')[0]
Avatar billede jaffafo Nybegynder
09. september 2004 - 14:28 #5
hmm jeg kan ikke helt overskue hvordan jeg skal kode det.

hvis nu jeg har denne string her:

dim streng as string = "på http://www.yahoo.com har du mulighed for at søge"

hvordan ville koden se ud?
Avatar billede snepnet Nybegynder
09. september 2004 - 14:33 #6
Sådan noget som i denne stil kunne gøre :
(jeg har ikke så meget tid lige nu, så jeg har bare klasket det ind - ved ikke om det funger, men du kan muligvis se idéen).

if(someText.IndexOf("http://") != -1)
{
  HyperLink hl = new HyperLink();
  hl.NavigateUrl = someText.SubString(0,someText.IndexOf(" "));
  hl.Text = someText.SubString(someText.SubString(someText.IndexOf(" "), someText.Legnth-someText.IndexOf(" "));
  someContainer.Controls.Add(hl);
}
else
{
  Label l = new Label();
  l.Text = someText;
  someContainer.Controls.Add(l);
}

mvh
Avatar billede jaffafo Nybegynder
09. september 2004 - 14:38 #7
hmm  lige to ting..

det er vb og jeg har ingen container. :/
Avatar billede snepnet Nybegynder
09. september 2004 - 17:11 #8
du kan trygt regne med at du har en container, men hvis du ikke specifikt opretter et Panel ell. (altså en eller anden kontrol du kan putte flere kontroller i), har du Page-objektet som kontrolcontainer.

På VB's

If Not (someText.IndexOf("http://") = -1) Then
Dim hl As HyperLink = New HyperLink ()
hl.NavigateUrl = someText.SubString(0, someText.IndexOf(" "))
hl.Text = someText.SubString(someText.SubString(someText.IndexOf(" "), someText.Legnth - someText.IndexOf(" ")))
someContainer.Controls.Add(hl)
Else
Dim l As Label = New Label ()
l.Text = someText
someContainer.Controls.Add(l)
End If

Ellers kan du bruge denne online-oversætter :
http://www.developerfusion.com/utilities/convertcsharptovb.aspx
Avatar billede thrytter Nybegynder
09. september 2004 - 18:48 #9
Prøv denne funktion der kun laver 'http://'-ordet om til et link og bevarer tekst før og efter 'http://'-ordet.

Returnerer en PlaceHolder som kan indsættes ved eks.
  someContainer.Controls.Add(ConvertToLink("På http://www.eksperten.dk kan du finde svaret."))

Private Function ConvertToLink(ByVal sSomeText As String) As PlaceHolder
  Dim phTmp As New PlaceHolder
  Dim hlTmp As New HyperLink

  Dim iStart As Integer = sSomeText.IndexOf("http://")
  Dim iEnd As Integer

  Dim sHyperLink As String

  If iStart <> -1 Then
    iEnd = sSomeText.IndexOf(" ", iStart)

    If iEnd = -1 Then
      iEnd = sSomeText.Length
    End If

    phTmp.Controls.Add(New LiteralControl(sSomeText.Substring(0, iStart)))

    sHyperLink = sSomeText.Substring(iStart, iEnd - iStart)

    hlTmp.NavigateUrl = sHyperLink
    hlTmp.Text = sHyperLink

    phTmp.Controls.Add(hlTmp)

    phTmp.Controls.Add(New LiteralControl(sSomeText.Substring(iEnd, sSomeText.Length - iEnd)))   
  Else
    phTmp.Controls.Add(New LiteralControl(sSomeText))
  End If

  ConvertToLink = phTmp
End Function
Avatar billede jaffafo Nybegynder
10. september 2004 - 00:39 #10
Hej  thrytters eksempel virker udmærket.. 

er det muligt at man kan udbygge det sådan at den laver email adresser om link til som mailto:blabla@bla.bla?
Avatar billede jaffafo Nybegynder
10. september 2004 - 00:42 #11
hmm  jeg tænkte lige..  er det muligt at nogen gider "omskrive" det så jeg gøre sådan her:

Label.text = ConvertToLink(Datareader.Data("fronttekst")))

?  jeg giver lige lidt flere points
Avatar billede snepnet Nybegynder
10. september 2004 - 08:21 #12
Kan du ikke vise, hvordan du sætter dine labels ind nu ?
Avatar billede jaffafo Nybegynder
10. september 2004 - 16:12 #13
Dataoledb.Opendb("BLABLA")
    DataOleDB.DanData("SELECT * FROM MENU WHERE MenuID=" & Request.Querystring("sid") & ";")
    If DataOleDB.Data.Read()
    lblTekst.text = DataOleDB.Data("Forside").Replace(VbCrLf, "<br />").Replace("&test;", "'")
    Else
        lblTekst.text = "Der er intet indhold"
    End If       
Dataoledb.closedb()
Avatar billede jaffafo Nybegynder
16. september 2004 - 16:56 #14
anyone?
Avatar billede snepnet Nybegynder
16. september 2004 - 17:00 #15
damn... denne her havde jeg da helt svedt ud :o(
kan du ikke bare klaske den placeholder der returneres fra thrytters metode istedet for din label ?
Avatar billede snepnet Nybegynder
16. september 2004 - 17:03 #16
Du kan også få det skrevet om til en kontrol, så du fra koden bare kan lave denne her, hvis du f.eks. vil smide den ind på din form :

this.Form1.Controls.Add(new JaffafoSpecialPanel(<sometext>));

Ville det være noget ?

mvh
Avatar billede jaffafo Nybegynder
17. september 2004 - 02:33 #17
er det slet ikke muligt at bare kunne smide en streng med noget tekst ind i en function der så finder Http:// i stringen, laver det til et link og så smider en string tilbage?
Avatar billede jaffafo Nybegynder
22. september 2004 - 01:27 #18
er det slet ikke muligt at bare kunne smide en streng med noget tekst ind i en function der så finder Http:// i stringen, laver det til et link og så smider en string tilbage?

Nu har jeg bøvlet med det i et par dage og kan ikke komme videre...  please kan nogen hjælpe?..  jeg kan godt give 200 points.. det er ret vigtigt.. :/
Avatar billede thrytter Nybegynder
22. september 2004 - 08:15 #19
Prøv denne funktion som vist nok omdanner alle http://-ord til link, og bibeholder øvrig tekst.

Public Function ConvertToLink(ByVal sSomeText As String) As String
  Dim sb As New System.Text.StringBuilder

  Dim sElements As String()

  Dim i As Integer = 0
  Dim iStart As Integer = 0
  Dim iEnd As Integer = 0

  sSomeText = sSomeText.Replace("http://", "#http://")

  While sSomeText.IndexOf("#http://", iEnd) <> -1
    iStart = sSomeText.IndexOf("#http://", iEnd)

    iEnd = sSomeText.IndexOf(" ", iStart)

    If iEnd <> -1 Then
      sSomeText = sSomeText.Insert(iEnd, "#")
    Else
      Exit While
    End If
  End While

  sElements = sSomeText.Split("#"c)

  For i = 0 To sElements.Length - 1
    If sElements(i).IndexOf("http://") <> -1 Then
      sb.Append("<a href=""")
      sb.Append(sElements(i))
      sb.Append(""">")
      sb.Append(sElements(i))
      sb.Append("</a>")
    Else
      sb.Append(sElements(i))
    End If
  Next

  ConvertToLink = sb.ToString
End Function
Avatar billede snepnet Nybegynder
22. september 2004 - 08:35 #20
HAHA :o) - jeg har også lige siddet og lavet en...  det var sq. muntert :o)
Avatar billede snepnet Nybegynder
22. september 2004 - 08:45 #21
Nå - men den kan du jo egentlig også bare få.... Så har du lidt mere at vælge imellem :o)

using System;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace EXP2
{
    public class jaffafo : System.Web.UI.Page
    {
        protected HtmlForm Form1;

        private void Page_Load(object sender, System.EventArgs e)
        {
            string someText = @"Her på http://www.yahoo.com har du mulighed for at søge på hvad der ligger på http://www.dr.dk og det er gode sager";
            Form1.Controls.Add(new LiteralControl(HrefIt(someText)));

        }

        private string HrefIt(string someText)
        {
            StringBuilder builder = new StringBuilder();
            int linkStart = 0, linkEnd = 0, ofset = 0;
           
            while ((linkStart = someText.IndexOf("http://", ofset)) != -1)
            {
                builder.Append(someText.Substring(ofset, linkStart-ofset));

                linkEnd = someText.IndexOf(" ", linkStart);
               
                if (linkEnd == -1)
                    linkEnd = someText.Length;

                builder.Append(String.Format(@"<a href=""{0}"">{0}</a>", someText.Substring(linkStart, linkEnd - linkStart)));
               
                ofset = linkEnd;
            }
           
            builder.Append(someText.Substring(linkEnd, someText.Length-linkEnd));
            return builder.ToString();
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }
    }
}
Avatar billede snepnet Nybegynder
22. september 2004 - 08:47 #22
Æhh... hov - det var hele "testsiden". Du får lige metoden i VB :
(jeg lavede bare lidt om i den første thrytter sendte)

Private Function HrefIt(ByVal someText As String) As String
Dim builder As StringBuilder = New StringBuilder ()
Dim linkStart As Integer = 0
Dim linkEnd As Integer = 0
Dim ofset As Integer = 0
While Not ((linkStart = someText.IndexOf("http://", ofset)) = -1)
  builder.Append(someText.Substring(ofset, linkStart - ofset))
  linkEnd = someText.IndexOf(" ", linkStart)
  If linkEnd = -1 Then
    linkEnd = someText.Length
  End If
  builder.Append(String.Format("<a href=""{0}"">{0}</a>", someText.Substring(linkStart, linkEnd - linkStart)))
  ofset = linkEnd
End While
builder.Append(someText.Substring(linkEnd, someText.Length - linkEnd))
Return builder.ToString()
End Function
Avatar billede jaffafo Nybegynder
22. september 2004 - 12:39 #23
nice..  very nice.. ;)

jeg tester dem lige ;)
Avatar billede jaffafo Nybegynder
22. september 2004 - 13:32 #24
Thrytter:

I dit svar er der et lille problem. Hvis jeg laver linjeskift direkte efter http://.. så kommer det med i linket.. dvs linket bliver til http://www.yahoo.com/<br />  :/
Avatar billede thrytter Nybegynder
22. september 2004 - 13:46 #25
Hvis der ikke er mellemrum mellem http://... og <br /> opfattes hele ordet (selvfølgelig) som et link.

Kan løses ved tilføjelse af
  sSomeText = sSomeText.Replace("<br />", " <br />")

Problemet opstår også i snepnet's løsning, hvor der også søges efter førstkommende mellemrum.
Avatar billede jaffafo Nybegynder
24. september 2004 - 02:00 #26
hej igen..  nu virker den fint, men har et lille problem..  jeg har lavet den om til at lave mailto: link også..    det fungerer fint, men jeg vil lige fjerne "mailto:" fra teksten..


       
Dim sb As New System.Text.StringBuilder
           
Dim sElements As String()
           
Dim i As Integer = 0
Dim iStart As Integer = 0
Dim iEnd As Integer = 0
           
sSomeText = sSomeText.Replace("mailto:", "#mailto:")
sSomeText = sSomeText.Replace(VbCrlf," <br />")
           
While sSomeText.IndexOf("#mailto:", iEnd) <> -1
    iStart = sSomeText.IndexOf("#mailto:", iEnd)
               
    iEnd = sSomeText.IndexOf(" ", iStart)
               
    If iEnd <> -1 Then
        sSomeText = sSomeText.Insert(iEnd, "#")
    Else
        Exit While
    End If
End While
           
sElements = sSomeText.Split("#"c)
           
For i = 0 To sElements.Length - 1
    If sElements(i).IndexOf("mailto:") <> -1 Then
        sb.Append("<a href=""")
        sb.Append(sElements(i))
        sb.Append(""">")
        sb.Append(sElements(i))
        sb.Append("</a>")

    Else
        sb.Append(sElements(i))
    End If
Next
           
emaillink = sb.ToString
---------------------------------------

Hvordan gør jeg det?


p.s.  Snepnet.. smid lige et svar  din løsning er da også ok ;)  dog er der en lille fejl i den :)
Avatar billede jaffafo Nybegynder
30. september 2004 - 22:57 #27
har løst det med mailto:linket..

For i = 0 To sElements.Length - 1
    If sElements(i).IndexOf("mailto:") <> -1 Then
        sb.Append("<a href=""")
        sb.Append(sElements(i))
        sb.Append(""">")
        sb.Append(sElements(i).Substring(7))
        sb.Append("</a>")

    Else
        sb.Append(sElements(i))
    End If
Next


Sådan der..

så skal Snepnep lige smide et svar så lukker vi tråden :)  jeg takker mange gange for svarene..
Avatar billede snepnet Nybegynder
30. september 2004 - 23:15 #28
ok :o)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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