![]() |
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
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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