Avatar billede justask Nybegynder
22. november 2006 - 21:19 Der er 5 kommentarer

find url via regular expression

Hej

Det er sikkert en klassiker, men når man hverken er en haj til C# eller regex er der jo ingen anden vej end at spørge jer  :)

Hvordan skruer jeg et udtryk sammen der giver mig urlen mellem gåseøjnene? Jeg er reelt ikke interesseret i at validere om url'en er korrekt, det klarer jeg efterfølgende med "if(Uri.IsWellFormedUriString(url))...". Jeg forestiller mig at udtrykket returnerer hvad der er mellem single/double quotes'ne - noget i stil med flg.:
Regex rx = new Regex(@"(href|src|action)=(""|')[^\s'\""](""|')");
Altså, hvis vi finder en attribut (href/src/action) vil jeg gerne ha' dennes værdi.

Håber I kan hjælpe

takker
Avatar billede dj_uncas Nybegynder
22. november 2006 - 21:41 #1
Regx rgx = new Regex( @"^(.*)(href|src|action)=\"(.*)\"(.*)$" );

^ Jeg tror det skulle gøre det for dig :-)
Avatar billede dj_uncas Nybegynder
22. november 2006 - 21:43 #2
Så kan du finde værdien ved at replace:

string tag = "<a href=\"http://domæne.dk\">Super-Link</a>
string value = rgx.Replace( tag, "$3" );
Avatar billede dj_uncas Nybegynder
22. november 2006 - 21:43 #3
(sidste post er taget ud fra hukommelsen. Jeg er ikke sikker på jeg kan huske implementeringen af Regex 100%...
Avatar billede justask Nybegynder
23. november 2006 - 10:42 #4
Tak for indlægget, men det virker ikke helt. Strings skal vidst ikke escapes med backslash når der er @ foran? Anywayz, selvom jeg retter det kan jeg ikke få presset nogle urler ud  :(  I får lige lidt kode, håber det hjælper:

            // fetch webpage
            Uri url = new Uri("http://dr.dk");
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            Stream stream = httpWebResponse.GetResponseStream();
            StreamReader streamReader = new StreamReader(stream, Encoding.ASCII);

            // find links
            ArrayList listOfUrls = new ArrayList();
            Regex rx = new Regex(@"^(.*)(href|src|action)=""(.*)""(.*)$");
                // @"\w+://(\w+(:\w+)?@)?\S+(/\S*?)?"
                // "href=\"((.|\\n)*?)\"" - ok
                // @"(href|src|action)=""[^\s'\""]"""
            string homepage = streamReader.ReadToEnd();
            Match m = rx.Match(homepage);
            int amount = m.Length;
            while (m.Success)
            {
                Group g = m.Groups[0];
                CaptureCollection cc = g.Captures;
                for (int j = 0; j < cc.Count; j++)
                {
                    Capture c = cc[j];
                    listOfUrls.Add(c.ToString());
                }
                m = m.NextMatch();
            }
Avatar billede justask Nybegynder
23. november 2006 - 10:54 #5
Så tror jeg, jeg fik noget der virker ret godt:
    Regex rx = new Regex("(href|action)=('|\")[^'\"]*('|\")");
Eneste problem er, at mine matches har attributten med, ex.:
    "href=\"http://www.dr.dk/p4/?oversigt\""
Og jeg ville jo gerne bare have værdien ud, ex.:
    "http://www.dr.dk/p4/?oversigt"
Kan man gøre det i regex-udtrykket?
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