我有这样的网址(例如):
https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=delphi+url+parameters+
我需要按名称获取/设置参数值(“sourceid”,“ion”,...)。我怎样才能做到这一点? Delphi有TIdURI类,它有助于解析URL而不是参数,它将所有参数作为单个字符串返回(属性Params)。当然我可以创建自己的解析器,但它是如此基本的功能,应该有一些标准的方式(我希望)。我很惊讶TIdURI没有它。
答案 0 :(得分:4)
您需要先将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;
要创建新网址,只需撤消该流程:
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;
答案 1 :(得分:4)
使用System.Net.URLClient单元中的TURI
这是一条记录,首先需要加载地址字符串: TUri.create(' http://google.com&#39)。
然后你可以使用 MyUri.ParameterByName [' PARAM&#39]。
也可以 URLEncode的 URLDecode, AddParameter, DeleteParameter 属性参数[const I:Integer](TNameValuePair)等