2013-05-22 11 views
12

मुझे एक यूआरएल को विभिन्न सेगमेंट में तोड़ने में सक्षम होना चाहिए। उदाहरण के लिए इस मार्ग लें:मैं एक वेब यूआरएल कैसे पार्स करूं?

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 जोड़ने के लिए, मैंने देखा है कि ऐसे वेब सर्वर वास्तव में हार्डवेयर एपीआई जैसे स्विचेस/राउटर, आईपी निगरानी कैमरे, वीओआईपी फोन इत्यादि हैं –

उत्तर

28

इंडी, जो उस उद्देश्य के लिए एक TIdURI वर्ग है, जैसे के साथ 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 इससे भी बेहतर, यह हमेशा एक लाभ होता है जब किसी भाषा में कुछ पहले से ही encapsulated और कार्यान्वित किया जाता है :) –

+2

इंडी डेल्फी भाषा का हिस्सा नहीं है। यह सिर्फ एक पूर्व-बंडल तृतीय पक्ष पुस्तकालय है। लेकिन कम से कम यूआरआई पार्सिंग में कोई बाहरी निर्भरता नहीं है क्योंकि इसे सादे डेल्फी कोड में लागू किया गया है। –

+0

वैसे मेरा मतलब आईडीई में उपलब्ध है। इंडी निश्चित रूप से डेल्फी का हिस्सा नहीं है, यही कारण है कि यह इंडी है :) मैं आसानी से उपयोग के लिए, इस समाधान का उपयोग कर हवा का उपयोग करूंगा। –

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 
+0

+1 उत्कृष्टता, मैंने कुछ मिनट पहले अपना प्रश्न संपादित किया और पोर्ट नंबर जोड़ा नमूना के लिए। –

+0

स्वीकार किया गया क्योंकि यह निर्भरताओं के बिना अधिक प्रत्यक्ष तरीका है। –

+3

@ जेरीडॉज: इस समाधान पर निर्भरता है: विंडोज 2000+ और विनइनेट। –

संबंधित मुद्दे