// Hiermit kann man den Quellcode einer HTML-Seite nach Links durchsuchen,
// wobei auch verschiedene Schreibweisen berücksichtigt werden, wie z.B.:
//
<a href="http://www.meinweb.de">
// <a href=http://www.meinweb.de>
// <A href=   "www.meinweb.de/test.zip  "  >
// <a    HREF   =   FILE.HTM   >


// Getestet mit D4 unter XP

procedure FindLinks(Datei: string; gefunden: TStrings); 
const 
  a: array[0..1] of char = ('<', 'a'); 
  b: array[0..3] of char = ('h', 'r', 'e', 'f'); 
var 
  sl, gef: TStringlist; 
  pb: Pchar; 
  position, lg: integer; 
  procedure weiter(i: integer); 
  begin 
    inc(position, i); 
    inc(pb, i); 
  end; 
  function leerzeichenweg: boolean; 
  begin 
    result := false; 
    while pb^ in [#13, #10, #32, '\'] do begin 
      weiter(1); 
      if position >= lg then exit; 
    end; 
    result := true; 
  end; 
  function anfang: boolean; 
  begin 
    result := false; 
    while not comparemem(@a, pb, 2) do begin 
      weiter(1); 
      if position >= lg - 7 then exit; 
    end; 
    weiter(2); 
    if (not leerzeichenweg) then exit; 
    if (not comparemem(@b, pb, 4)) then exit; 
    weiter(4); 
    if (not leerzeichenweg) or (pb^ <> '=') then exit; 
    weiter(1); 
    if (not leerzeichenweg) then exit; 
    if pb^ = '"' then weiter(1); 
    result := true; 
  end; 
  procedure ende; 
  var 
    hlp: string; 
    pe: pointer; 
    merk: integer; 
  begin 
    pe := @pb^; 
    merk := position; 
    while (pb^ <> '"') and (pb^ <> '>') 
      do begin 
      weiter(1); 
      if position >= lg then break; 
    end; 
    setlength(hlp, position - merk); 
    copymemory(@hlp[1], pe, position - merk); 
    hlp := stringreplace(Trim(stringreplace(hlp, #10, '', 
      [rfReplaceAll])), #13, '', [rfReplaceAll]); 
    if ansilastchar(hlp) = ':' then delete(hlp, length(hlp), 1); 
    if copy(hlp, 1, 6) <> 'mailto' then 
      gef.add(hlp); 
  end; 
begin 
  gefunden.clear; 
  sl := TStringlist.create; 
  gef := TStringlist.create; 
  gef.sorted := true; 
  gef.Duplicates := dupIgnore; 
  try 
    sl.LoadFromFile(datei); 
    sl.text := Ansilowercase(sl.text); 
    sl.text := stringreplace(sl.text, ' ', #32, [rfreplaceall]); 
    lg := length(sl.text); 
    pb := @sl.text[1]; 
    position := 0; 
    repeat 
      if anfang then ende 
      else weiter(1); 
    until position >= lg - 7; 
    gefunden.assign(gef); 
  finally 
    gef.free; 
    sl.free 
  end; 
end; 
 
 
// Beispielaufruf 
 
procedure TForm1.Button11Click(Sender: TObject); 
begin 
  FindLinks('C:\Eigene Dateien\Eigene Webs\Delphi\main.htm', listbox1.items); 
  if listbox1.items.count = 0 then 
    listbox1.items.add('--- Nichts gefunden ---') else 
    listbox1.sorted := true; 
end; 



Zugriffe seit 6.9.2001 auf Delphi-Ecke