超难算法:取得URL中如bbs.csdn.net的部分
例如:
一个地址:http://user:pass@www.163.com:8080/music/chs/index.aspx?mid=23081712
可以先删除http://user:pass@,然后从:8080/开始把后面的也删除了,这就得到www.163.com,如果我表达的不清楚下面有程序描述,
function GetDomainRoot(url: string): string;//获得一个URL地址的域var p1:integer;begin //http://user:pass@www.163.com:8080/music/chs/index.aspx?mid=23081712 // p1 result:=''; if LeastUrlRequest(url) then//检验URL是否合法,判断是否含有,{<>这一类的字符 begin //去掉协议 p1:=pos('://',url); if (p1>0) then Delete(url,1,p1+2); p1:=pos('/',url); if (p1>1) then begin //得到主机地址user:pass@www.163.com:8080 url:=Copy(url,1,p1-1); if url<>'' then begin //去掉用户名和密码www.163.com:8080 p1:=pos('@',url); if (p1>0) then Delete(url,1,p1); //去掉端口www.163.com Delete(url,pos(':',url),Length(url)); end; if (pos('192.168.',url)>0) or (NCpos('localhost',url)>0) or (Pos('.',url)<=0) then//局域网的不要 result:='' else result:=url; end else if (length(url)>=3) and (url[1]<>'/') then //a.b满足域名或文件名的形式 result:=url; end;end;
i := 1;
flag := false;
pstr := @url;
// result:='';
if LeastUrlRequest(url) then//检验URL是否合法,判断是否含有,{}<>这一类的字符
//我在Delphi7里没找到这个函数,此处应该也是遍历url查找,可以将它整合到下面的判断中
begin
while url[i] <>'' do
//此处用for可能能更好的替代处理if (length(url)>=3) and (url[1]<>'/') then
//我有些看不懂上句的具体作用,^_^
//url[i] <>'' 可以 替代为 ord(url[i])<> 0 ,我不太清楚哪个好
begin
if url[i] = '.' then
flag := True //找到 . 意味着已经进入域名,那么域名头不用再定位
else
begin
if (url[i] = '/') or (url[i] = '@') or (url[i] = ':') then
begin
if flag = false then
pstr := @url[i+1] //不断的定位域名头
else
begin
url[i] := char(0); //将url后面多于的部分删除
break;
end;
end;
end;
i := i+1; //inc(i);
end;
result := pstr;
if (pos('192.168.',result)>0) then //局域网的不要 ,(Pos('.',url)<=0) then已经在while里实现了
result:='';
end
else
result := '';
end;
[解决办法]
url[i] 的操作已经多了一次间接寻址,建议直接使用 pCh = Pointer(url); pCh^ 取字符,下一个字符使用 Inc(pCh) 即可。