Parsing URIs

En rask og enkel måte å analysere URI er sett på kommersielle biblioteker NB: Hvis du har en Internett-bibliotek har du allerede URI analysefunksjoner, men dette kan fungere som en alternativ måte, en sjekk på hvordan parsing algoritmen verker, en måte å tilbringe en kreditt artikkel, en måte å flamme noen andre koding, etc
på Indy (Internet Direct) for URI parsing sjekk TIdURI
klasse på idURI Uniton TurboPower Internet Professional for IpMisc enhet funksjon IpParseURL
Dont vite om ICS om
En URI er den måten at en internett-adresse presenterer seg selv, de fleste protokollene følger en URI. En URI har følgende syntaks: [PROTOKOLL +: //] HOST [: PORT] [underkataloger] [DOCUMENT] [# + FAVORITTER] Nå her er den måten jeg kom opp for URI parsing, koden er kommen < --- ------------------ BEGIN KODE --------------------------- > funksjon ISNUMBER (ACharacter: Char): Boolean, begynner Resultat: = Pos (ACharacter, '0123456789') > 0; end {Analyser params fra en URL til en TStrings EG. http://search.yahoo.com/bin/search?p=britney+spears dest [0] = 'p = britney + spyd' For å få tilgang params og verdier sjekke TStringList.Names og TStringList.Values} prosedyre SplitParams (konst Params : String, Mål: TStrings); Var p: Integer; Tmp: String; begynne hvis ikke Assigned (dest) deretter Exit; Dest.Clear; Tmp: = Params; p: = Pos ('&', TMP); while (p > 0) gjør begynne Dest.Add (Copy (TMP, 1, s -1)); Tmp: = Kopier (tmp, P + 1, Lengde (TMP) - p); p: = Pos ('&', TMP); slutt; Dest.Add (TMP); end {Gitt en URL sjekk for en spørring, returnerer spørringen startposisjon, og params i Params, denne funksjonen bruker SplitParams} prosedyre ProcessQuery (konst URL: String; Params: TStrings; Var QueryPos: Integer); begynne //Alt etter? er params så send dem til splitparams QueryPos: = Pos ('?', URL); hvis QueryPos > 0 da SplitParams (Copy (URL, QueryPos + 1, Lengde (URL) -QueryPos), Params); end {Gitt en URL få dokumentnavnet er det noen spesielle tilfeller til dette: 1) hvis URL er av form http: //www.hello.com det er ingen dokument, men når spørres til serveren vil den returnere en, så gå tilbake ingen dokumenter 2) hvis URL er av form http://www.hi.com/index.php eller http: //www.hi.com/index.php#thisis eller http://www.hi.com/index.php#thisis?howareyou=hacker deretter dokumentet index.php glemme alt annet} funksjon QueryDocument (konst URL: String; Var DocPos: integer): String; Var QueryPos, jeg: Integer; begynne Resultat: = ''; //sjekk for parametere ProcessQuery (URL, nil, QueryPos); if (QueryPos > 0), og start DEC (QueryPos); jeg: = QueryPos; mens URL [QueryPos] < > '/' Gjøre DEC (i); inc (i); Resultat: = Kopier (URL, jeg en, QueryPos); ende annet begin {QueryPos er ikke funnet prøve å få enten en docname eller sjekke om noe dokument for hånden} i: = Lengde (URL); mens URL [i] < > '/' Gjøre DEC (i); inc (i); DocPos: = i; if (i > = Pos (': //", URL) 3) deretter Resultat: = Kopier (URL, i, Lengde (URL)) ellers begynne //Ingen dokument eller url av skjemaet www.hello.com Resultat: = ''; Gå; slutt; slutt; //se etter eventuelle bokmerker i dokumentet hvis Pos ('#', Result) > 0 da Resultat: = Kopier (Resultat, 1, Pos ('#', Result) -1); hvis pos ('/', Result) > 0 deretter Slett (Resultat, pos ('/', Result), 1); end {Query portnummeret til en url hvis noen EG. www.hello.com:8000 QueryPort vil returnere 8000 ellers vil returnere 0} funksjon QueryPort (konst URL: String): Integer; Var DotIdx, SlashIdx: Integer; Tmp, Buffer: String; begynne tmp: = URL; hvis Pos (': //', TMP) > 0 deretter Slett (TMP, Pos (': //', TMP), 3); SlashIdx: = Pos ('/', TMP) -1; hvis SlashIdx < 0 deretter SlashIdx: = Lengde (TMP); DotIdx: = Pos (':', TMP); hvis DotIdx < 0 da //ingen portnummer så avslutte grasiøst exit; Buffer: = Kopier (TMP, DotIdx + 1, SlashIdx); val (buffer, Result, DotIdx); end {Query et bokmerke i et dokument EG. www.hello.com/index.htm#notwelcome QueryBookMark vil returnere 'notwelcome'} funksjon QueryBookmark (konst URL: String): String; Var HashPos: Integer; QuestionPos: Integer; begynne HashPos: = Pos ('#', URL); if (HashPos < = 0) deretter Exit; QuestionPos: = POS (, URL '?'); if (QuestionPos < = 0) så QuestionPos: = Lengde (URL); Resultat: = Kopier (URL, HashPos + 1, QuestionPos-1); end; prosedyre ParseURI (konst URI: String; Var Host, Dokument, bokmerke, Port: String; QueryParams: TStrings); Var QueryPos, DocPos: integer; begynne ProcessQuery (URI, QueryParams, QueryPos); Bokmerk: = QueryBookmark (URI); Port: = IntTOStr (QueryPort (URI)); Dokument: = QueryDocument (URI, DocPos); Host: = Kopier (URI, 1, DocPos -1); end; < --------------------- END KODE --------- -------------------- > Forresten denne algoritmen måten kan forlenges, utvidet, etc., og jeg jobber med det. Noen forslag, kommentarer, kritikere, slippe comment.KNOWN BUGS: * Ifølge noen kilder på Pos-funksjonen er ikke like raskt som den burde være, og kan ikke brukes for reverse string posisjonering * Ja jeg vet dette aint den beste algoritmen for URI analyse, som i skrivende stund jeg jobber ute på forbedringer, kode forstørrelser etc.