![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть у меня такая ф-ция для парсинга. Она использует VBScript_RegExp_55_TLB.
Код:
function TForm1.Parse(page, pattern: string): string;
var
Reg: TRegExp;
mc: MatchCollection;
m: Match;
sm: SubMatches;
i:Integer;
s,r:string;
begin
Reg := TRegExp.Create(Self);
try
//Reg.Pattern := 'name="s" value="(.*)"';
s:=page;
Reg.Pattern:=pattern;
Reg.IgnoreCase:=true;
Reg.Global:=true;
Reg.Multiline:=true;
mc:=Reg.Execute(s) as MatchCollection;
for I := 0 to mc.Count - 1 do begin
//ShowMessage(inttostr(mc.Count));
m:=mc[i] as Match;
sm:=m.SubMatches as SubMatches;
//Вроде тут нужно что-то изменить
//ShowMessage(VarToStr(sm[i]));
r:=trim(VarToStr(sm[0]));
Result:=r;
end;
finally
m:=nil;
sm:=nil;
mc:=nil;
Reg.Free;
end;
end;Используется очень просто: Код:
main:=Parse(html,'<title>(.*)</title>'); Проблема в том, что она ищет лишь одно значение. У меня задача - получить урлы ВСЕХ картинки из небольшого куска html кода. Подскажите, как заставить её отдавать массив ссылок на картинки (<img src="(.*)") Либо возможно есть альтернативное готовое решение по парсингу картинок? |
|
#2
|
||||
|
||||
|
TStringList тебя спасёт.
|
|
#3
|
|||
|
|||
|
Цитата:
Код:
function TForm17.MParse(page, pattern: string): TstringList;
var
Reg: TRegExp;
mc: MatchCollection;
m: Match;
sm: SubMatches;
i:Integer;
s:string;
results:TstringList;
begin
Reg := TRegExp.Create(Self);
results := TStringList.Create;
try
//Reg.Pattern := 'name="s" value="(.*)"';
s:=page;
Reg.Pattern:=pattern;
Reg.IgnoreCase:=true;
Reg.Global:=true;
Reg.Multiline:=true;
mc:=Reg.Execute(s) as MatchCollection;
for I := 0 to mc.Count - 1 do begin
m:=mc[i] as Match;
sm:=m.SubMatches as SubMatches;
ShowMessage(VarToStr(sm[i]));
results.Add(sm[i]);
Result:=results;
end;
finally
m:=nil;
sm:=nil;
mc:=nil;
Reg.Free;
results.Free;
end;
end;Последний раз редактировалось MrDiG, 30.09.2011 в 16:10. |
|
#4
|
||||
|
||||
|
Ну, почти. Так у тебя утечка памяти будет, если ты не будешь результат очищать где-нибудь. Лучше TStringList создавать в вызывающем коде, после чего удалять там же. Ну и передавать в процедуру параметром.
А, хотя у тебя и этот код не будет работать. Ты же удаляешь StringList в конце функции, и программа использовать его уже не сможет. Последний раз редактировалось PhoeniX, 30.09.2011 в 17:19. |
|
#5
|
|||
|
|||
|
Цитата:
Извиняюсь, но сильно туплю. Так? Сама ф-ция: Код:
function TForm1.MParse(page, pattern: string; results:TstringList): TstringList;
var
Reg: TRegExp;
mc: MatchCollection;
m: Match;
sm: SubMatches;
i:Integer;
s:string;
begin
Reg := TRegExp.Create(Self);
try
//Reg.Pattern := 'name="s" value="(.*)"';
s:=page;
Reg.Pattern:=pattern;
Reg.IgnoreCase:=true;
Reg.Global:=true;
Reg.Multiline:=true;
mc:=Reg.Execute(s) as MatchCollection;
for I := 0 to mc.Count - 1 do begin
m:=mc[i] as Match;
sm:=m.SubMatches as SubMatches;
results.Add(VarToStr(sm[i]));
Result:=results;
end;
finally
m:=nil;
sm:=nil;
mc:=nil;
Reg.Free;
end;
end;Вызов: Код:
procedure TForm1.Button1Click(Sender: TObject);
var
html:String;
images:TStringList;
i:integer;
results:TstringList;
begin
html:=idHTTP1.Get('http://url.com');
results := TStringList.Create;
images:=MParse(html,'"<img src="(.*)"',results);
for i := 0 to images.Count-1 do
begin
ShowMessage(images[i]);
end;
end; |