16. august 2002 - 21:55
#2
Jeg skal da aldrig lave en parser!!!
Nå, men selv om det sikkert er ret meget slam-kode, så virker det da... Smæk en TMemo, en TListBox og en TButton ind på din form... Sæt noget HTML-kode ind i Memo'en og fra knappens OnClick-event kalder du så følgende kode:
procedure TForm1.Button1Click(Sender: TObject);
function GetLinks(S: String; var ReturnStr: TStringList): Boolean;
function MinNotZero(A, B: Integer): Integer;
begin
if (A > B) and (B <> 0) then
Result := B
else Result := A;
end;
var
I: Integer;
S1: String;
begin
Result := False;
I := Pos('<', S);
while I <> 0 do
begin
S := Copy(S, I+1, Length(S));
S := TrimLeft(S);
if (S[1] = 'a') or (S[1] = 'A') then
begin
I := Pos('href', LowerCase(S));
if I = 0 then Exit;
S1 := Copy(S, I+Length('href'), Length(S));
S1 := TrimLeft(S1);
S1 := Copy(S1, 2, Length(S1)); //Væk med "="
S1 := TrimLeft(S1);
if S1[1] = '"' then
begin
Delete(S1, 1, 1);
S1 := Copy(S1, 0, Pos('"', S1)-1);
end
else
S1 := Copy(S1, 0, MinNotZero(Pos(' ', S1), Pos('>', S1))-1);
ReturnStr.Add(S1);
S := Copy(S, Pos('>', S)+1, Length(S));
Result := True;
end;
I := Pos('<', S);
end;
end;
var
I: Integer;
sl: TStringList;
begin
sl := TStringList.Create;
ListBox1.Clear;
for I := 0 to Memo1.Lines.Count -1 do
GetLinks(Memo1.Lines.Strings[I], sl);
ListBox1.Items.Assign(sl);
end;
Bemærk lige at jeg bare har skrevet koden uden at optimere ret meget... Jeg haaader at parse!!! :)
Nå, men jeg håber da det kan bruges!
//hermandsen
19. august 2002 - 10:59
#4
Tak for kommentarerne, men jeg har faktisk allerede lavet det selv. Problemet er at jeg ikke kan være 200% sikker på at jeg har taget højde for alle tænkelige måder links/frames kan stå i HTML, derfor ville jeg gerne have en komponent som er brugt af andre, og derfor testet mere end jeg kan teste min egen kode.