![]() |
FTP URL in Bestandteile splitten
Hi,
ich versuche schon die ganze Zeit eine vernünftige Routine zum aufsplitten eines URL Stringes in seine Bestandteile zu programmieren. Komme aber irgendwie nicht weiter. Ein String im Format 'ftp://benutzername:kennwort@hostname:21/Verzeichnis/Datei.txt' soll in seine Bestandteile zerlegt und mir in einzelnen Stringvariablen
Hat schon jemand von euch so eine Routine programmiert. Ich wäre euch echt dankbar. Gruss Alois ;) |
Re: FTP URL in Bestandteile splitten
Zeig doch mal, was du schon hast.
Und warumn sthet das unter 'Programmieren allgemein'? Geht es nicht um Delphi? |
Re: FTP URL in Bestandteile splitten
Mal so ins Blaue:
![]() |
Re: FTP URL in Bestandteile splitten
Hi,
hier mal ein schnelles Quick and Dirty Beispiel. In wie weit das richtig funktioniert, weiß ich nicht, aber mit dem FTP-Dings im ersten Post geht es :mrgreen:
Delphi-Quellcode:
type
TFTPURL = record Username, Password, Host, Path, FileName: String; Port: Integer; end; // Die passende Funktion: function ParseFTPURL(const FTPURL: String): TFTPURL; var Temp: String; begin Temp := FTPURL; Delete(Temp, 1, 6); // ftp:// entfernen Result.Username := Copy(Temp, 0, Pos(':', Temp) - 1); // Benutzername kopieren Delete(Temp, 1, Pos(':', Temp)); // Benutzername entfernen Result.Password := Copy(Temp, 1, Pos('@', Temp) - 1); // Kennwort kopieren Delete(Temp, 1, Pos('@', Temp)); // Kennwort entfernen Result.Host := Copy(Temp, 1, Pos(':', Temp) - 1); // Host kopieren Delete(Temp, 1, Pos(':', Temp)); // Host entfernen Result.Port := StrToInt(Copy(Temp, 1, Pos('/', Temp) - 1)); // Port kopieren Delete(Temp, 1, Pos('/', Temp)); // Port entfernen Temp := StringReplace(Temp, '/', '\', [rfReplaceAll]); Result.Path := ExtractFilePath(Temp); Result.FileName := ExtractFileName(Temp); end; // Aufruf (z.B.): procedure TForm1.Button1Click(Sender: TObject); var FTP: TFTPURL; begin FTP := ParseFTPURL(FTP_URL); with RichEdit1.Lines do begin Add(FTP.Username); Add(FTP.Password); Add(FTP.Host); Add(IntToStr(FTP.Port)); Add(FTP.Path); Add(FTP.FileName); end; end; |
Re: FTP URL in Bestandteile splitten
Wieso denn so umständlich (das bezieht sich auf InternetCrackUrl...)? Ich meine, wenn die URL tatsächlich immer genau diese Form hat, muss doch nur mit Copy / Pos / Delete nacheinander durch die Bestandteile gegangen werden:
Delphi-Quellcode:
Dann braucht man nicht InternetCrackUrl benutzen und das damit verbundene Speichermanagement entfällt.
var
tmpURL, Prot, User, Pass, Host, Dir, File, FileExt: String; function GetAndDelete(Delim: String): String; begin Result := Copy(tmpURL, 1, Pos(Delim, tmpURL) - 1); Delete(tmpURL, 1, Pos(Delim, tmpURL) + Length(Delim) - 1); end; begin tmpURL := 'ftp://benutzername:kennwort@hostname:21/Verzeichnis/Datei.txt'; Prot := GetAndDelete('://'); User := GetAndDelete(':'); Pass := GetAndDelete('@'); //Und so weiter... end; Abgesehen davon kann man so auch auf Fehler besser reagieren, da man bei InternetCrackUrl nur weiß, dass es nicht geklappt hat, aber nicht wo... :wink: Ich seh grad, so ähnlich aber nicht so kompakt hat es auch schon Spider gepostet... |
Re: FTP URL in Bestandteile splitten
Vielen Dank für eure Antworten. Das ging aber flott...
Werde ich gleich mal ausprobieren. Noch 'ne Frage: Wie rufe ich die Funktion CrackUrl eigentlich auf und wie habe ich Zugriff auf die einzelnen Variablen??
Delphi-Quellcode:
Greetz Alois ;)
type
TEasyURLComponents = record Scheme, HostName: string; Port: Integer; User, Password, UrlPath, ExtraInfo: string; end; procedure CrackURL(const URL: string; decode, escape: Boolean; var data: TEasyURLComponents ); var uc: TURLComponents; flags: Cardinal; begin ZeroMemory(@uc, sizeof(uc)); uc.dwStructSize := sizeof(TURLComponents); with data do begin SetLength(Scheme, 10); uc.lpszScheme := PChar(Scheme); uc.dwSchemeLength := Length(Scheme); SetLength(HostName, 200); uc.lpszHostName := PChar(HostName); uc.dwHostNameLength := Length(HostName); SetLength(User, 200); uc.lpszUserName := PChar(User); uc.dwUserNameLength := Length(User); SetLength(Password, 200); uc.lpszPassword := PChar(Password); uc.dwPasswordLength := Length(Password); SetLength(UrlPath, 1000); uc.lpszUrlPath := PChar(UrlPath); uc.dwUrlPathLength := Length(UrlPath); SetLength(ExtraInfo, 2000); uc.lpszExtraInfo := PChar(ExtraInfo); uc.dwExtraInfoLength:= Length(ExtraInfo); end; flags := 0; // Converts encoded characters back to their normal form. if decode then flags := flags or ICU_DECODE; // Converts all escape sequences (%xx) to their corresponding characters. if escape then flags := flags or ICU_ESCAPE; if not InternetCrackUrl(PChar(URL), Length(URL), flags, uc) then RaiseLastWin32Error; with data do begin SetLength(Scheme, uc.dwSchemeLength); SetLength(HostName, uc.dwHostNameLength); SetLength(User, uc.dwUserNameLength); SetLength(Password, uc.dwPasswordLength); SetLength(UrlPath, uc.dwUrlPathLength); SetLength(ExtraInfo, uc.dwExtraInfoLength); Port := uc.nPort; end; end; |
Re: FTP URL in Bestandteile splitten
Delphi-Quellcode:
procedure Blubb;
var Data: TEasyURLComponents; begin CrackURL('Deine gewünschte URL', true, true, Data); ShowMessage(Data.User); end; |
DP-Maintenance
Dieses Thema wurde von "Luckie" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Also soll es doch mit Delphi gelöst werden. Das nächste mal besser auf die Sparte achten. |
Re: FTP URL in Bestandteile splitten
Oder per Regular Expression:
So in etwa müsste das hinkommen:
Code:
dabei wird allerdings davon ausgegangen, daß benutzername:passwort auch auf jeden fall gesetzt sind.
ftp://([^:|.*]*):+([^:|^@|.*]*)@+([^:|.*]*):*([0-9]*)([^\.|.*]*/+)(.*)
Match 1: Benutzername Match 2: Kennwort Match 3: Hostname Match 4: Port Match 5: Verzeichnis (mit / am Ende) Match 6: Datei Sollte mit TRegExpr von ![]() Bis neulich ... [edit=Luckie]Smilies deaktiviert. Ausdruck in Code-Tags gesetzt. Mfg, Luckie[/edit] [edit=Grendel]Mensch! Lass einem doch mal die Zeit selber zu korrigieren :)[/edit] |
Re: FTP URL in Bestandteile splitten
oder man bedient sich der Indy-Klasse TIdURI (mit i am Ende) die kann sowas auch
|
Re: FTP URL in Bestandteile splitten
hallo,
wie ist denn das jetzt, wenn man als passwort eine email hat: ![]() bei den beispielen hier, TIdURI und internetcrackurl wird als passwort 'eine' und als host 'mail.de@server.com' zurückgegeben ... was nun? |
Re: FTP URL in Bestandteile splitten
Hi,
ich würde es mit dem für URL encodierten Code für das @-Zeichen probieren: %40, also sollte die URL dann so aussehen: "ftp://benutzer:e%40mail.de@server:port/verzeichnis/file.ext". Auf ![]() cu |
Re: FTP URL in Bestandteile splitten
Da musst du den ersten Klammeraffen wohl Url-encoden '@' => %40, also
![]() //EDIT: roten Kasten ignoriert |
Re: FTP URL in Bestandteile splitten
mein vorschlag: (funzt mit emails im user und pass)
Delphi-Quellcode:
GetFilename kopiert einfach nur den filename raus ...
type
TMyURL = record url, protocol, user, pass, host, port, path, filename : String; end; function CrackUrl(url : String; var res : TMyURL):boolean; var atpos, tmppos : integer; hp, rest : string; begin try tmppos := 0; res.url := url; res.protocol := copy(url,0,pos('://',url)-1); url := copy(url,pos('://',url)+3,length(url)); res.user := copy(url,0,pos(':',url)-1); url := copy(url,pos(':',url)+1,length(url)); repeat atpos := tmppos; tmppos := PosEx('@',url,tmppos+1); until tmppos+atpos = atpos; res.pass := copy(url,0,atpos-1); url := copy(url,atpos+1,length(url)); hp := copy(url,0,pos('/',url)-1); if pos(':',hp)=0 then begin res.host := hp; res.port := '21'; end else begin res.host := copy(hp,0,pos(':',hp)-1); res.port := copy(hp,pos(':',hp)+1,length(hp)); end; url := copy(url,pos('/',url),length(url)); res.filename := fMain.GetFileName(url); if (res.filename = '') or (pos('.',res.filename)=0) then res.path := copy(url,0,length(url)) else res.path := copy(url,0,pos(res.filename,url)-1); Result := true; except Result := false; end; end; das ganze könte man jez noch mehr absichern, indem man auch des letzte ':' und auch auf unglückliche '/' im user/pass prüft ... mfg, eyeless |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz