2013-05-22 3 views
12

URL을 다른 세그먼트로 나눌 수 있어야합니다. 예를 들어이 경로를 가지고 :웹 URL을 구문 분석하려면 어떻게해야합니까?

Protocol: HTTP 
Username: login 
Password: password 
Host: somehost.somedomain.com 
Port: 8080 
Path Info: /some_path/something_else.html 
Query String: param1=val&param2=val 

가 어떻게 델파이에서이 작업을 수행 할 수 있습니다 : 다음과 같이

http://login:[email protected]:8080/some_path/something_else.html?param1=val&param2=val#nose 
\__/ \___/ \______/ \_____________________/ \__/\____________________________/ \___________________/ \__/ 
|  |  |    |    |    |      |    | 
Scheme Username Password  Host   Port    Path     Query   Fragment 

이 분해해야합니까? 이걸 나눠 줄 수있는 뭔가 준비 됐어? 그렇지 않다면 가능한 모든 다른 형식을 파싱하는 방법은 무엇입니까? 이것은 HTTPS 또는 RTSP와 같은 다른 프로토콜 일 수도 있다고 가정합니다.

+0

우리의 비밀 번호는 일반 텍스트가 아닙니다. – eggy

+0

@eggy 기술적으로 이것은 일부 시스템 인증 방법입니다. 암호화가 필요한지 여부는 서버 구현에 달려 있습니다. –

+0

@eggy 추가하려면 스위치/라우터, IP 감시 카메라, VoIP 전화 등과 같은 하드웨어 API가 있어야합니다. –

답변

28

XE2 배송 : 나는 모든 희망

uses 
    ..., IdURI; 

var 
    URI: TIdURI; 

URI := TIdURI.Create('http://login:[email protected]:8080/some_path/something_else.html?param1=val&param2=val'); 
try 
    // Protocol = URI.Protocol 
    // Username = URI.Username 
    // Password = URI.Password 
    // Host = URI.Host 
    // Port = URI.Port 
    // Path = URI.Path 
    // Query = URI.Params 
finally 
    URI.Free; 
end; 
+0

+1 뭔가가 이미 캡슐화되어 있고 언어로 구현되어있을 때 거의 항상 유리합니다. –

+2

Indy는 Delphi 언어의 일부가 아닙니다. 그것은 사전 번들 된 타사 라이브러리입니다. 그러나 적어도 URI 파싱은 일반 Delphi 코드로 구현되므로 외부 종속성이 없습니다. –

+0

글쎄, 나는 IDE에서 사용할 수 있다는 것을 의미한다. 물론 Indy는 Delphi의 일부가 아닙니다. Indy가 그 이유입니다. 어쨌든 사용하기 쉽도록이 솔루션을 사용하고 있습니다. –

19

InternetCrackUrl 방법을 사용할 수 있습니다.

이 간단한

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    SysUtils, 
    WinInet; 

procedure ParseURL(const lpszUrl: string); 
var 
    lpszScheme  : array[0..INTERNET_MAX_SCHEME_LENGTH - 1] of Char; 
    lpszHostName : array[0..INTERNET_MAX_HOST_NAME_LENGTH - 1] of Char; 
    lpszUserName : array[0..INTERNET_MAX_USER_NAME_LENGTH - 1] of Char; 
    lpszPassword : array[0..INTERNET_MAX_PASSWORD_LENGTH - 1] of Char; 
    lpszUrlPath  : array[0..INTERNET_MAX_PATH_LENGTH - 1] of Char; 
    lpszExtraInfo : array[0..1024 - 1] of Char; 
    lpUrlComponents : TURLComponents; 
begin 
    ZeroMemory(@lpszScheme, SizeOf(lpszScheme)); 
    ZeroMemory(@lpszHostName, SizeOf(lpszHostName)); 
    ZeroMemory(@lpszUserName, SizeOf(lpszUserName)); 
    ZeroMemory(@lpszPassword, SizeOf(lpszPassword)); 
    ZeroMemory(@lpszUrlPath, SizeOf(lpszUrlPath)); 
    ZeroMemory(@lpszExtraInfo, SizeOf(lpszExtraInfo)); 
    ZeroMemory(@lpUrlComponents, SizeOf(TURLComponents)); 

    lpUrlComponents.dwStructSize  := SizeOf(TURLComponents); 
    lpUrlComponents.lpszScheme  := lpszScheme; 
    lpUrlComponents.dwSchemeLength := SizeOf(lpszScheme); 
    lpUrlComponents.lpszHostName  := lpszHostName; 
    lpUrlComponents.dwHostNameLength := SizeOf(lpszHostName); 
    lpUrlComponents.lpszUserName  := lpszUserName; 
    lpUrlComponents.dwUserNameLength := SizeOf(lpszUserName); 
    lpUrlComponents.lpszPassword  := lpszPassword; 
    lpUrlComponents.dwPasswordLength := SizeOf(lpszPassword); 
    lpUrlComponents.lpszUrlPath  := lpszUrlPath; 
    lpUrlComponents.dwUrlPathLength := SizeOf(lpszUrlPath); 
    lpUrlComponents.lpszExtraInfo  := lpszExtraInfo; 
    lpUrlComponents.dwExtraInfoLength := SizeOf(lpszExtraInfo); 

    InternetCrackUrl(PChar(lpszUrl), Length(lpszUrl), ICU_DECODE or ICU_ESCAPE, lpUrlComponents); 

    Writeln(Format('Protocol : %s',[lpszScheme])); 
    Writeln(Format('Host  : %s',[lpszHostName])); 
    Writeln(Format('User  : %s',[lpszUserName])); 
    Writeln(Format('Password : %s',[lpszPassword])); 
    Writeln(Format('Path  : %s',[lpszUrlPath])); 
    Writeln(Format('ExtraInfo: %s',[lpszExtraInfo])); 
end; 

begin 
    try 
    ParseURL('http://login:[email protected]/some_path/something_else.html?param1=val&param2=val'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    readln; 
end. 

이 반환됩니다 시도

Protocol : http 
Host  : somehost.somedomain.com 
User  : login 
Password : password 
Path  : /some_path/something_else.html 
ExtraInfo: ?param1=val&param2=val 
그 목적을 위해 TIdURI 클래스가 인디, 예와
+0

+1 호감도, 몇 분 전에 질문을 편집하고 포트 번호를 추가했습니다. 샘플에. –

+0

의존성이없는 직접적인 방법이기 때문에 받아 들여집니다. –

+3

@JerryDodge :이 솔루션에는 Windows 2000 이상 및 WinInet이 있습니다. –

관련 문제