Witam, uwziąłem się i prześledziłem wszystko co mi podał Olesio, siedziałem dziś nad tym długo, ale zrozumiałem jak co działa.
Oto wynik mojej pracy:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, httpsend, StdCtrls, RegExpr;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button2: TButton;
ListBox1: TListBox;
Button1: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
const
Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10';
var
TF : TextFile;
FPage : string;
SynHttp : THttpSend;
begin
AssignFile(TF, 'zrodlo.html');
Rewrite(TF);
SynHttp := THttpSend.Create;
SynHttp.UserAgent := Opera_UserAgent;
SynHttp.HTTPMethod('GET', 'http://www.google.pl');
SetLength(FPage, SynHttp.Document.Size);
SynHttp.Document.Read(Pointer(FPage)^, Length(FPage));
//Writeln(TF, FPage);
Memo1.Text := FPage;
SynHttp.Free;
CloseFile(TF);
end;
function znajdzZwierze (const AInputString : string) : string;
const
kodZwierzaka = '\#+2+.+\#+1';
var
r : TRegExpr;
begin
Result := '';
r := TRegExpr.Create;
try
r.Expression := kodZwierzaka;
if r.Exec (AInputString) then
REPEAT
Result := Result + r.Match [0] + ',';
UNTIL not r.ExecNext;
finally r.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
listbox1.Items.CommaText := znajdzZwierze (Memo1.Text);
end;
end.
Teraz jednym z problemów jest ze po wywołaniu procedury onclick przycisku Button2 czasami załaduje się kod całej strony do Memo1, a czasami tylko kawałek, a chciałbym żeby ładował się ciągle cały kod.
Kolejny problem jest z wyrażeniem regularnym
Na razie wymyśliłem takie: '#+2+.+#+1' ale to wyrażenie nie działa tak jak chce.
Chce żeby mi działało w inny sposób, na razie działa tak, mam kod źródłowy strony:
<body>
afjkafakfa#zmija#jifds
kopelat pies i kot *hsmoki*
jak ci na imie to to jest to
jkdfsajfd;safjds$rybka$jdkfafjdis
*hryba*;daffkafa
kjdsafj*hkotek*
#2zwierz nr 1#1jidfsifjdafdsjfi
sda
#2zwierze nr 5#1jidfsifjdafdsjfi
sda
</body>
po parsowaniu powstaje mi oto taki wynik:
#2zwierz nr 3#1jidfsifjdafdsjfi
sda
#2zwierze nr 5#1
A moim celem jest zmienić te wyrażenie żeby wynik był taki
#2zwierz nr 3#1
#2zwierze nr 5#1
Ale chce żeby wyrażenie działało na takiej zasadzie ze pomiędzy #2 i #1 mógł być dowolny znak, ale jak widać program odczytuje mi od pierwszego #2 do ostatniego #1 pomijając te w środku.
Edit:
poprawiłem swój kod wygląda on teraz tak: kodZwierzaka='#2[^\s]+#1';
nazwy zwierzaków są każdy w nowej lini i pomiędzy #2 i #1 nie będzie spacji tylko nazwa zwierzaka