Er der nogen der kender en HTML parser der kan give mig alle links/frames (og alt synlig text) fra en HTML klump? Links i en TStringList ville være nice.
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!!! :)
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.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.