Einzelnen Beitrag anzeigen

Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
508 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Alle Image-Links aus HTML-String extrahieren (schnell)?

  Alt 14. Apr 2015, 00:27
Ok, konnte es doch nicht sein lassen und habs schon jetzt gemacht ^^
Bild und Projekt ist angehängt, und die Parszeit ist minimal (0.001s - zusehen im Titel vom Fenster)

Hier die Klasse:
Delphi-Quellcode:
unit ImgPathParser;

interface

uses
  Classes, SysUtils;

type
  TImgPathParser = class
  private
    function FGetImgPath(Index : integer) : string;
    function FGetCount : integer;
  public
    ImgPaths : TStringList;
    procedure Parse(AHTML : string);
    property Count : Integer read FGetCount;
    property ImgPath[Index : integer] : string Read FGetImgPath;
  end;

var
  RealativeLink : string = 'http://www.delphipraxis.net/'; // Um einen Relativen Link generieren zu können.

implementation

{ TImagPathParser }

function TImgPathParser.FGetCount: integer;
begin
  Result := ImgPaths.Count;
end;

function TImgPathParser.FGetImgPath(Index: integer): string;
begin
  Result := ImgPaths[Index];
end;

procedure TImgPathParser.Parse(AHTML: string);
var
  CurrentCharIndex: Integer;
  CurrentChar : Char;
  InString : Boolean;
  Buffer : string;
  Extension : string;
begin
  Buffer := '';
  InString := false;
  ImgPaths := TStringList.Create;

  for CurrentCharIndex := 1 to Length(AHTML) do
  begin
    CurrentChar := AHTML[CurrentCharIndex];

    if (not InString) and
       (CurrentChar = '"') then
    begin
      InString := true;
      Continue;
    end;

    if InString then
    begin
      if CurrentChar = '"then
      begin
        Extension := LowerCase(Copy(Buffer, Length(Buffer)-2,3));

        // !!! EXTENSIONS !!!
        if (Extension = 'png') or
           (Extension = 'gif') or
           (Extension = 'jpg') or
           (LowerCase(Copy(Buffer, Length(Buffer)-3,4)) = 'jpeg') then
        begin
          if Copy(Buffer, 0, 7) <> 'http://then
            Buffer := RealativeLink + Buffer;
        
          ImgPaths.Add(Buffer);
        end;

        InString := false;
        Buffer := '';

        Continue;
      end;

      Buffer := Buffer + CurrentChar;
    end;

  end;
end;

end.
Benutzen kannst du sie so:
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  StartTime : TDateTime;
begin
  StartTime := Now;

  ImgPaths.Parse(mmo1.Text);

  Text := FloatToStr(MilliSecondsBetween(Now,StartTime) / 1000) + 's';
end;
Hoffe, das ist in etwa so wie du es brauchst

Freundliche Grüsse
Miniaturansicht angehängter Grafiken
pxtz.jpg  
Angehängte Dateien
Dateityp: zip ImgPathParser.zip (968,4 KB, 11x aufgerufen)
Milos

Geändert von milos (14. Apr 2015 um 00:30 Uhr)
  Mit Zitat antworten Zitat