Witam.
Mam problem bo nie za bardzo wiem jak w tekście (SynMemo) znaleźć wyrażenie:
function nazwa_funkcji(
i tak cały text "przelecieć" a nazwa_funkcji jest zmienna i chciałbym ją odczytać.
Mam także pytanie jak zoptymalizować taką funkcję gdyż ma ona się odbywać w czasie rzeczywistym bo to ma być do edytora PHP, później będzie dodawać tą nazwę do takiej tabeli ale z resztą sobie już poradzę.
Wiem że musi być utworzona pętla o warunku rozmiaru textu tylko nie wiem jak wyszukać tej frazy, podobnie będę musiał utworzyć dla include(''); i tak dalej.
Ja bym użył wyrażeń regularnych. Dla Pascala poniższy kod działa w sumie ok dla funkcji z parametrami,
a takie Ciebie chyba interesują. Użyłem na szybko wprawdzie Memo, ale pod SynMemo czy SynEdit, też
powinno działać bez problemów. Ewentualnie sobie popraw Expression, tak aby Tobie odpowiadało, a ów
moduł dp wyrażeń regularnych z dokumentacją wrzuciłem na: http://www.mediafire.com/?czhw3mmzjyn
//...
uses
regexpr;
function GetFuncsNames(AInputString : string) : string;
var
RMain, RFunc : TRegExpr;
begin
Result := '';
RMain := TRegExpr.Create;
RFunc := TRegExpr.Create;
try
RMain.Expression := 'function (.+?);';
RFunc.Expression := '(.+?)\((.+)\)';
if RMain.Exec(AInputString) = True then
begin
repeat
if RFunc.Exec(RMain.Match[1]) = True then
begin
Result := Result + RFunc.Match[1] + #13#10
end;
until RMain.ExecNext = False;
end;
Delete(Result, Length(Result) - 1, 2);
finally
RMain.Free;
RFunc.Free;
end;
end;
procedure TForm1.Button1Click(Sender : TObject);
begin
Memo1.Lines.LoadFromFile('D:\test.pas');
Memo1.Text := GetFuncsNames(Memo1.Text);
end;
Nie, nie Synapse. Bo do parsowania tekstów się ono raczej nie nadaje.
Poza tym drogi haterze, jeśli chcesz mnie ktyrykować - to dlaczego się
tutaj nie zarejestrujesz? To raz. Dwa - to dlaczego sam nie odpowiesz
na pytanie ProQix Polaczeq - tylko zaśmiecasz forum bzdetami. Wiem,
że krytykowac jest najłatwiej, niż konkretnie pomóc. Pokazałeś "klasę".
Ok dzięki za odp. sprawdzę to suebie w chacie bo neta w domu nie mam i pisze w szkole...
A co do optymalizacji kodu w czasie rzeczywistym tzn jak napisze sobe po załadowaniu pliku jak go edytuje i dopisze tam kolejna linijka function ... to zeby sie to od razu dodalo, a jak usune to zeby sie usunelo z tej listy?
Ten kod powinien się wykonywać dość szybko, jednak jeżeli chcesz
uauwać z listy to posłuż się może TStringList z nazwami funkcji i do
niej dodawaj jeżeli IndexOf('nazwa_funkcji') = -1, a usuwaj także z
użyciem IndexOf. A i IndexOf, ignoruje wielkość liter w parametrze.