Avatar billede -hex- Nybegynder
30. april 2003 - 11:26 Der er 8 kommentarer

Hente links ud fra streng

Hejsa,

Jeg har to spørgsmål:

Spørgsmål 1:

Er der nogen der ligger inde med en funktion (eller kender til en indbygget metode) der looper en streng i gennem og returnerer evt. URLs der måtte være i strengen? Jeg har forsøgt at lege lidt med Regex, men synes ikke rigtig det fungere som jeg ønsker det.

Spørgsmål 2:

Når/hvis funktionen finder et link i strengen så skal den checke om linket er aktivt eller om det er et "dead link", hvis linket virker så skal funktionen returnere 'true' og ellers 'false'

Håber det var forståeligt og at der sidder en eller anden skarp hjerne derude som kan gennemskue en løsningsmodel :)

/Hex
Avatar billede -hex- Nybegynder
30. april 2003 - 11:30 #1
... jeg glemte at sige, at jeg vil sætte pris på hvis evt. kodeeksempler er i C#
Avatar billede chries Nybegynder
30. april 2003 - 11:36 #2
spm 1.

Opret en streamreader og lav en passende regex. den jeg har givet med er til at parse html kode.

HttpWebRequest request;
HttpWebResponse response;
Stream s;

// create a request to the url
request = (HttpWebRequest) WebRequest.Create("http://www.w3c.org/");

// get the response
response = (HttpWebResponse) request.GetResponse();

// get the stream of data and read into a string
s = response.GetResponseStream();
string strContents = new StreamReader(s).ReadToEnd();

Regex r = new Regex("href\\s*=\\s*(?:(?:\\\"(?<url>[^\\\"]*)\\\")|(?<url>[^\\s]* ))");
MatchCollection mc1 = r.Matches(strContents);
Console.WriteLine(r.ToString());
foreach(Match m1 in mc1)
{
    //Output details of Match
    Console.WriteLine("Match: {0}", m1.Value);

    //Output details of Groups
    foreach(Group g in m1.Groups)
    {
        Console.WriteLine("URL: {0}", g.Value);
    }
}
Avatar billede chries Nybegynder
30. april 2003 - 11:37 #3
eller hvis du har en string direkte, er det også fint :)
Avatar billede chries Nybegynder
30. april 2003 - 11:38 #4
Avatar billede -hex- Nybegynder
30. april 2003 - 12:49 #5
Tak det ser fint ud, dog virker det ikke rigtigt - jeg ved ikke hvilke namespaces jeg skal inkludere, flere af variablerne er heller ikke deklareret og fejler derfor =/
Avatar billede chries Nybegynder
30. april 2003 - 12:57 #6
// project created on 26-09-2002 at 14:36
using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;

class HTMLLinkParser
{
    public static void Main(string[] args)
    {
        HttpWebRequest request;
        HttpWebResponse response;
        Stream s;
       
        // create a request to the url
        request = (HttpWebRequest) WebRequest.Create("http://www.w3c.org/");
       
        // get the response
        response = (HttpWebResponse) request.GetResponse();
       
        // get the stream of data and read into a string
        s = response.GetResponseStream();
        string strContents = new StreamReader(s).ReadToEnd();
       
        Regex r = new Regex("href\\s*=\\s*(?:(?:\\\"(?<url>[^\\\"]*)\\\")|(?<url>[^\\s]* ))");
        MatchCollection mc1 = r.Matches(strContents);
        Console.WriteLine(r.ToString());
        foreach(Match m1 in mc1)
        {
            //Output details of Match
            Console.WriteLine("Match: {0}", m1.Value);
       
            //Output details of Groups
            foreach(Group g in m1.Groups)
            {
                Console.WriteLine("URL: {0}", g.Value);
            }
        }
    }
}
Avatar billede -hex- Nybegynder
30. april 2003 - 13:49 #7
Yeah, nu er den der næsten - mangler bare at få lavet min RegEx således at den ikke også returnere email-links som den gør nu (mailto:href=blablabla.dk). Jeg er kun interesseret i http://www.hejsa.dk, eller www.hejsa.dk osv. - er det noget der kan lade sig gøre med RegEx?
Avatar billede chries Nybegynder
01. maj 2003 - 09:21 #8
kan det sikkert, men jeg er ikke en haj til det :) en simpel fix kunne være (ikke lige testet):

        foreach(Match m1 in mc1)
        {
            if( m1.Value.ToLower().StartsWith( "mailto" ) == false )
            {
                //Output details of Match
                Console.WriteLine("Match: {0}", m1.Value);
           
                //Output details of Groups
                foreach(Group g in m1.Groups)
                {
                    Console.WriteLine("URL: {0}", g.Value);
                }
            }
        }
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