| Autor |
Beitrag |
DieHardMan
      
Beiträge: 19
|
Verfasst: Mo 19.06.06 03:22
Hallo,
hat jemand eine Lösung oder einen Lösungsvorschlag wie ich z.B. zu "<DIV class=artikel-teasertext>" den schließenden Tag finde, also den an letzer Stelle und nicht den vorherigen?
Habe schon sämtliche freien HTML Parser ausprobiert aber keiner bietet diese Möglichkeit.
Quelltext 1: 2: 3: 4: 5:
| <DIV class=artikel-teasertext> <H1>Überschrift</H1> <P>Text</P> <DIV>Authortext</DIV> </DIV> |
_________________ Mahlzeit
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mo 19.06.06 11:19
Hallo,
hab in meiner Sammlung was gefunden, die Funktion FindOuterHTML gibt einen String incl. des gesuchten Tags zurück. Wird der Tag nicht gefunden, einen Leerstring.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| function FindOuterHTML(sHTML,sTag: String;Start: Integer): String; var i,ii,l,x,PosA,PosE : Integer; s : String; begin Result := ''; s := UpperCase(sTag); l := Length(s); x := -1; i := Start; PosA := 0; while i < Length(sHTML) do begin inc(i); if sHTML[i] = '<' then begin ii := 1; inc(i); if sHTML[i] = '/' then begin inc(i); while UpCase(sHTML[i]) = s[ii] do begin inc(ii); inc(i); end; if ii = l+1 then begin if sHTML[i] = '>' then dec(x); if x = -1 then begin PosE := i+1; break; end; end; end else begin while UpCase(sHTML[i]) = s[ii] do begin inc(ii); inc(i); end; if ii = l+1 then begin if (sHTML[i] = ' ') or (sHTML[i] = '>') then inc(x); if x = 0 then PosA := i-l-1; end; end; end; end; if PosA <> 0 then Result := Copy(sHTML,PosA,PosE-PosA); end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
DieHardMan 
      
Beiträge: 19
|
Verfasst: Di 20.06.06 00:03
Hey danke, hätte nicht gedacht da ne Antwort zu erhalten. Habe gerade alles eingebaut und funktioniert tadellos.
Hier eine ergänzende Funktion falls sie jemand braucht (Achtung nicht optimiert):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| function DeleteHtmlSubStr(TagElement, S: String; Repetitions: Integer): String; var strTagName, strTemp: String; intPos, i: Integer; begin If (TagElement = '') or (S = '') or (Repetitions = 0) then begin Result := S; exit; end;
If (Copy(TagElement, 1, 1) = '<') and (Copy(TagElement, Length(TagElement), 1) = '>') then begin Delete(TagElement, 1, 1); Delete(TagElement, Length(TagElement), 1); end;
For i := 1 to Repetitions do begin intPos := Pos(UpperCase('<' + TagElement + '>'), UpperCase(S));
If intPos = 0 then continue;
strTagName := TagElement; If Pos(' ', strTagName) <> 0 then Delete(strTagName, Pos(' ', strTagName), Length(strTagName)); strTagName := UpperCase(Trim(strTagName));
strTemp := Trim(FindOuterHtml(S, strTagName, intPos - 2));
If strTemp = '' then begin Result := S; exit; end;
Delete(S, intPos, Length(strTemp)); end; If Length(S) < 3 then S := '';
Result := S; end; |
_________________ Mahlzeit
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 20.06.06 14:45
DieHardMan hat folgendes geschrieben: | ...Hier eine ergänzende Funktion falls sie jemand braucht (Achtung nicht optimiert):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| intPos := Pos(UpperCase('<' + TagElement + '>'), UpperCase(S));
If intPos = 0 then continue; | |
ist so nicht ideal, denn durch + '>' werden nur Tag-Blöcke berücksichtigt die im Eröffnungs-Tag keine Tag-Attribute enthalten.
In der Funktion FindOuterHtml werden Tags mit Attributen berücksichtigt, das könnte unter Umständen Fehler erzeugen. Außerdem ist es nicht gerade optimal das die Funktion FindOuterHtml einen String zurückliefert, der dann in Der Funktion DeleteHtmlSubStr mittels Length() zum löschen des Tag-Blocks genutzt wird.
Hab die beiden Funktionen mal kombiniert und optimiert(geht bestimmt noch besser).
Mit der Funktion können verschachtelte Tag-Blöcke und auch Standalone-Tags(z.B. <!-- <META, <br ... , mit und ohne Attribute, gelöscht werden.:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98:
| function DeleteOuterHTML(sHTML,sTag: String;Start,Repetitions: Integer): String; var z,i,ii,L_TmpTag,x,PosA,PosE : Integer; sTmpTag : String; begin for z := 1 to Length(sTag) do if (sTag[z] <> '<') and (sTag[z] <> '>') then if sTag[z] = ' ' then break else sTmpTag := sTmpTag + sTag[z];
If (sTmpTag = '') or (sHTML = '') or (Repetitions = 0) then begin Result := sHTML; exit; end; sTmpTag := UpperCase(sTmpTag); L_TmpTag := Length(sTmpTag); i := Start; Start := 1;
for z := 1 to Repetitions do begin x := -1; PosA := 0; PosE := 0; while i < Length(sHTML) do begin inc(i); if sHTML[i] = '<' then begin ii := 1; inc(i); if sHTML[i] = '/' then begin inc(i); while UpCase(sHTML[i]) = sTmpTag[ii] do begin inc(ii); inc(i); end; if ii = L_TmpTag+1 then begin if sHTML[i] = '>' then dec(x); if x = -1 then begin PosE := i+1; break; end; end; end else begin while UpCase(sHTML[i]) = sTmpTag[ii] do begin inc(ii); inc(i); end; if ii = L_TmpTag+1 then begin if (sHTML[i] = ' ') or (sHTML[i] = '>') then inc(x); if x = 0 then PosA := i-L_TmpTag-1; end; end; end; end;
if (PosA <> 0) and (PosE <> 0) then begin Result := Result+Copy(sHTML,Start,PosA-Start); Start := PosE; end;
if (PosA <> 0) and (PosE = 0) then begin Result := Result+Copy(sHTML,Start,PosA-Start); ii := PosA+L_TmpTag; while sHTML[ii] <> '>' do inc(ii); Start := ii+1; i := ii; end;
if (PosA = 0) and (PosE = 0) then break; end; Result := Result+Copy(sHTML,Start,MAXINT); end; |
Hoffe mal das keine Fehler drinn sind  , kannst es ja mal testen.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
|