1

我有这样的网址(例如):

https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=delphi+url+parameters+

我需要按名称(“sourceid”,“ion”,...)获取/设置参数的值。我怎样才能做到这一点?Delphi 有 TIdURI 类,它有助于解析 URL 但不解析参数,它将所有参数作为单个字符串(属性参数)返回。当然,我可以创建自己的解析器,但它是如此基本的功能,应该有一些标准的方式(我希望)。我很惊讶 TIdURI 没有它。

4

2 回答 2

7

您需要先将 URL 解析为其组件,然后才能对参数进行解码。

Url := 'https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=delphi+url+parameters+';

Params := TStringList.Create;
try
  Params.Delimiter := '&';
  Params.StrictDelimiter := true;

  Uri := TIdURI.Create(Url);
  try
    Params.DelimitedText := Uri.Params;
  finally
    Uri.Free;
  end;

  for i := 0 to Params.Count -1 do
  begin
    Params.Strings[i] := StringReplace(Params.Strings[i], '+', ' ', [rfReplaceAll]);
    Params.Strings[i] := TIdURI.URLDecode(Params.Strings[i], enUtf8);
  end;

  // use Params as needed...

finally
  Params.Free;
end;

要创建一个新的 URL,只需反转该过程:

Params := TStringList.Create;
try

  // fill Params as needed...

  for i := 0 to Params.Count -1 do
  begin
    Params.Strings[i] := TIdURI.ParamsEncode(Params.Names[i], enUtf8) + '=' + TIdURI.ParamsEncode(Params.ValueFromIndex[i], enUtf8);
    Params.Strings[i] := StringReplace(Params.Strings[i], ' ', '+', [rfReplaceAll]);
  end;

  Params.Delimiter := '&';
  Params.StrictDelimiter := true;

  Uri := TIdURI.Create('');
  try
    // fill other Uri properties as needed...
    Uri.Params := Params.DelimitedText;
    URL := Uri.URI;
  finally
    Uri.Free;
  end;
finally
  Params.Free;
end;
于 2014-10-11T15:14:15.273 回答
6

使用 System.Net.URLClient 单元中的 TURI

这是一条记录,首先你需要加载地址字符串:TUri.create(' http://google.com ')。

然后你可以使用 MyUri.ParameterByName['param']。

它还可以 URLEncode URLDecode、AddParameter、DeleteParameter 属性 Parameter[const I: Integer] (TNameValuePair) 等

于 2017-04-05T06:30:20.343 回答