tut mir leid für die herzlichst beschissene Überschrift, mir ist nichts besseres eingefallen.
Im Zuge eines Projekts habe ich basierend auf einem alten HTML Parser für D6 (HTML Parser v1.2. von hier)
Dieser Verarbeitet HTML inhalt zu einer Liste mit Objekten die entweder THTMLTag's (alles was mit < > umschlossen ist und nicht in die anderen gruppen gehört) THtmlText(plaintext) THTMLServerScript (<?php ?>) und THTMLComment's (<!-- -->).
Damit habe ich dann ein Nodesystem gebastelt (da mich immer nur einzelne nodes interresieren), doch leider verschachtelt das die nodes im body teil komplett falsch.
Hier ist die Parse Methode (komplettes test projekt liegt im Anhang anbei)
Code: Alles auswählen
procedure THTMLDocument.Parse(htm: string);
function CheckTag(t: string): boolean;
var
i: integer;
begin
Result := True;
for i := 0 to 12 do
if LowerCase(t) = NonClosing[i] then
begin
Result := False;
break;
end;
end;
function ParseTag(var curr: integer; const l: TList): TNode;
begin
Result := TNode.Create(TObject(l[curr]) as THTMLTag);
Inc(curr);
// If container Element and isn't closed in the same line (e.g. <div />)
if CheckTag(Result.Name) and (Result.Param['/'] = nil) then
while curr < l.Count do
begin
if (TObject(l[curr]) is THTMLTag) then
begin // Is an html tag
if (TObject(l[curr]) as THTMLTag).Name[1] = '/' then
begin // starts with a / (closing tag>
if LowerCase((TObject(l[curr]) as THTMLTag).Name) = '/' +
LowerCase(Result.Name) then
begin // is the closing tag to our current tag
Inc(curr);
break;
end;
end
else
Result.AddNode(ParseTag(curr, l));
end
else if (TObject(l[curr]) is THTMLText) then
Result.Content := Result.Content + (TObject(l[curr]) as THTMLText).Text +
LineEnding;
Inc(curr);
end;
end;
var
i: integer;
begin
Parser.Memory.Clear;
Parser.Memory.Write(htm[1], Length(htm));
Parser.Execute;
i := 0;
while not (TObject(Parser.parsed[i]) is THTMLTag) do
Inc(i);
FRoot := ParseTag(i, Parser.parsed);
end;
EDIT:
Habe es gelöst, sollte es jemanden interresieren habe ich die Lösung (über BeniBela InternetTools, nicht mehr mit der alten D6 unit) als anhang hochgeladen
Grüße
Fred