How do I parse a web URL?

前端 未结 2 1915
心在旅途
心在旅途 2021-01-02 00:09

I need to be able to break a URL down into different segments. Take this path for example:

http://login:password@somehost.somedomain.com:8080/some_path/somet         


        
相关标签:
2条回答
  • 2021-01-02 00:22

    XE2 ships with Indy, which has a TIdURI class for that purpose, eg:

    uses
      ..., IdURI;
    
    var
      URI: TIdURI;
    
    URI := TIdURI.Create('http://login:password@somehost.somedomain.com: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 讨论(0)
  • 2021-01-02 00:28

    You can use the InternetCrackUrl method.

    Try this simple

    {$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:password@somehost.somedomain.com/some_path/something_else.html?param1=val&param2=val');
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      readln;
    end.
    

    This will return

    Protocol : http
    Host     : somehost.somedomain.com
    User     : login
    Password : password
    Path     : /some_path/something_else.html
    ExtraInfo: ?param1=val&param2=val
    
    0 讨论(0)
提交回复
热议问题