Avatar billede websam Nybegynder
25. januar 2006 - 11:40 Der er 13 kommentarer og
1 løsning

Strippe url for overflødige ting ?

Hejsa,

Jeg skal have en mulighed for at kunne fjerne diverse fra en url som denne :

http://www.google.dk/search?hl=da&q=asp&meta=

så den kommer til at se således ud :

http://www.google.dk/

Min ide er at finde ud af hvor folk kommer fra ved hjælp af :

HttpContext.Current.Request.ServerVariables("HTTP_REFERER")

Jeg skal så bruge både den fulde udgave af url'en men også en afkortet udgave som vist ovenfor.

Hvorledes går jeg dette ?

/Websam
Avatar billede websam Nybegynder
25. januar 2006 - 11:47 #1
Altså skal den strippe alt væk fra /'en efter .dk'et i url'en

/Websam
Avatar billede lordnelson Seniormester
25. januar 2006 - 12:45 #2
Hvis du har en variabel
der feks. hedder extern og ekstern indeholder den der HTTP_REFERER

Så vil variablen domain2 i nedenstånede indeholde hvor folk kommer fra

if extern >"" then
urlArray2=split(extern,"/")
domain2=mid(urlArray2(2),inStr(urlArray2(1),".")+1)
end if

LN
Avatar billede websam Nybegynder
25. januar 2006 - 12:59 #3
Ok jeg lavede lige et forsøg med følgende url :

http://www.google.dk/?m=123&a=456

Og det bliver til :

www.google.dk

Det er som sådan oxo fint nok men jeg ville gerne have det til at være :

http://www.google.dk/

altså beholde både http:// og / i url'en. Hvad skal der til hvis jeg skal kunne det ?

/Websam
Avatar billede websam Nybegynder
25. januar 2006 - 13:04 #4
Jeg kan jo selvfølgeligt lave det på denne måde :

Dim url1 As Array
Dim url2 As String
Dim extern As String = "http://www.google.dk/?m=123&a=456"
If extern > "" Then
    url1 = Split(extern, "/")
    url2 = "http://" & Mid(url1(2), InStr(url1(1), ".") + 1) & "/"
End If
Response.Write(url2)

Men det er jo ikke det pæneste ;o)

/Websam
Avatar billede nielle Nybegynder
25. januar 2006 - 13:16 #5
Umiddelbart ville jeg forvente at der allerede findes en class som bl.a. kan parse urls, men jeg har ikke kunnet finde den.

I stedet kan man jo altid ty til regulære udtryk:

string urlStr = "http://www.google.dk/search?hl=da&q=asp&meta=";

Regex re = new Regex("^((http|https|ftp)://)?(?<uri>[^/]+)", RegexOptions.IgnoreCase);
Match rem = re.Match(urlStr);
if (rem.Success)
{
    Console.WriteLine("URL: " + rem.Groups["uri"].Value);
}
else
{
    Console.WriteLine("Kunne ikke bestemme URL.");
}
Avatar billede nielle Nybegynder
25. januar 2006 - 13:23 #6
... eller i denne version hvor http'et også kommer med i resultatet:

string urlStr = "http://www.google.dk/search?hl=da&q=asp&meta=";

Regex re = new Regex("^(?<uri>((http|https|ftp)://)?[^/]+)", RegexOptions.IgnoreCase);
Match rem = re.Match(urlStr);
if (rem.Success)
    Console.WriteLine("URL: " + rem.Groups["uri"].Value);
else
    Console.WriteLine("Kunne ikke bestemme URL.");
Avatar billede websam Nybegynder
25. januar 2006 - 13:28 #7
Det virker nielle, men kan du forklare mig hvad det betyder of jeg fatter hat af regexp :

Regex("^(?<uri>((http|https|ftp)://)?[^/]+)", RegexOptions.IgnoreCase)

???

/Websam
Avatar billede websam Nybegynder
25. januar 2006 - 13:28 #8
Og er det muligt oxo at bibeholde /'en efter .dk'et ???

/Websam
Avatar billede nielle Nybegynder
25. januar 2006 - 13:34 #9
Ja, det er muligt:

string urlStr = "http://www.google.dk/search?hl=da&q=asp&meta=";

Regex re = new Regex("^(?<uri>((http|https|ftp)://)?[^/]+/?)", RegexOptions.IgnoreCase);
Match rem = re.Match(urlStr);
if (rem.Success)
    Console.WriteLine("URL: " + rem.Groups["uri"].Value);
else
    Console.WriteLine("Kunne ikke bestemme URL.");
Avatar billede nielle Nybegynder
25. januar 2006 - 13:56 #10
Forklaring:

(1)

|-tegenet betyder eller, og derfor betyder:

(http|https|ftp)

- http eller https eller ftp.

(2)

Derfor betyder:

(http|https|ftp)://

- en af disse tre muligheder efterfulgt af ://

(3)

Et ?-tegn tolkes som ”dette kan være der eller ej”, og derfor betyder:

((http|https|ftp)://)?

- at url’et kan begynde med http://, https://, ftp:// eller slet ikke have den del med.

Der er en ekstra parentes med i forhold til udtrykket i (2); Denne betyder bare at ?-tegnet går på det hele, og ikke kun på det allersidste tegn.

(4)

Dernæst kommer:

[^/]

- og dette betyder ”et tegn som ikke er et /-tegn” altså et hvert andet tegn end et /-tegn.

(5)

Et +-tegn betyder ”et eller flere tegn”, og derfor er:

[^/]+

- det samme som ”et eller flere tegn som ikke er et /-tegn”.

Regulære udtryk er som udgangspunkt ”grådige”. Dette betyder at de forsøger at matche så meget som overhovedet muligt. Af den grund så betyder det også at (5) skal tolkes som ”alle tegn fra nu af, som ikke er et /-tegn” eller ”alle tegn frem til lige før det næste /-tegn”.

(6)

Endeligt:

/?

- betyder at der så må komme et /-tegn eller ej. ?-tegnet blev forklaret i (3).

(7)

Nu har vi så matchet den del af url’et som vi er interesseret i. Dernæst skal vi bare have fat i værdien til vores C#-kode.

Dette gæres med denne konstruktion:

(?<uri> ... )

- som gør at vi siden hen kan få fat i værdien via dette:

rem.Groups[”uri”].Value

- hvor rem er resultatet af et kald til metoden Match() kaldt på det regulære udtryk.

(8)

Så er vi næsten ved vejs ende. Der mangler lige en forklaring på det lille ^-tegn som er i starten:

^-tegnet er et anchor (anker på dansk), og det bruges til at angive at ”her starter strengen”. Uden dette kunne man have matchet noget hvor url’et stod midt inde i teksten, og hvor der altså var noget tekst foran url’et.
Avatar billede websam Nybegynder
25. januar 2006 - 14:18 #11
Det er simplethen så super med en udførlig forklaring, Takker.

Med hensyn ^ skal jeg så forstå det således at hvis url'en stor midt i en tekst så skal jeg ikke bruge tegnet(^) ?

/Websam
Avatar billede nielle Nybegynder
25. januar 2006 - 14:41 #12
Korrekt :^)
Avatar billede websam Nybegynder
25. januar 2006 - 14:42 #13
Cool, takker.
Avatar billede nielle Nybegynder
25. januar 2006 - 19:13 #14
Korrektion: Mønsteret vil ikke fange et URL inde midt i en tekst – dvs. det vil det, men det vil tage alt for meget med hvis ikke url'et starter med f.eks. ”http://” men blot fremstår som ”www.google.dk”. Mønsteret virker mest optimalt hvis det er garanteret at din streng indeholder et url og ikke noget andet. Hvis man ønsker at kunne tage højde for alle mulige andre variationer over dette tema, så bliver mønsteret hurtigt meget mere komplekst.
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