Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.09.2011, 14:45
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию Вопрос по конкретной ф-ции парсинга

Есть у меня такая ф-ция для парсинга. Она использует 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  
Старый 30.09.2011, 15:45
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

TStringList тебя спасёт.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 30.09.2011, 16:06
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
TStringList тебя спасёт.
Как-то так?
Код:
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  
Старый 30.09.2011, 17:17
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Ну, почти. Так у тебя утечка памяти будет, если ты не будешь результат очищать где-нибудь. Лучше TStringList создавать в вызывающем коде, после чего удалять там же. Ну и передавать в процедуру параметром.

А, хотя у тебя и этот код не будет работать. Ты же удаляешь StringList в конце функции, и программа использовать его уже не сможет.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 30.09.2011 в 17:19.
Ответить с цитированием
  #5  
Старый 04.10.2011, 09:33
MrDiG MrDiG вне форума
Начинающий
 
Регистрация: 05.10.2010
Сообщения: 112
Репутация: 1227
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
Ну, почти. Так у тебя утечка памяти будет, если ты не будешь результат очищать где-нибудь. Лучше TStringList создавать в вызывающем коде, после чего удалять там же. Ну и передавать в процедуру параметром.

А, хотя у тебя и этот код не будет работать. Ты же удаляешь StringList в конце функции, и программа использовать его уже не сможет.

Извиняюсь, но сильно туплю. Так? Сама ф-ция:

Код:
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025