Тренируюсь на делфи писать спамеры по ПМ во всяких онлайн-играх. Возникла проблема с парсингом списка юзеров. Собственно после idHTTP.GET страницы получаю кусок исходного кода страницы, который необходимо "разобрать" HTML: class=header><b><a href=/tournaments/1021707>Премьер-лига: Кубок Друзей-11867</a> // 09.09.2009 09:50</td><tr bgcolor=white><td valign=top height=50px width=100%><li> <b>Призовой фонд:</b> 8.800<br><li> <b>Длительность:</b> до 120 минут<li> <b>Уровень игрока:</b> 2<li> <b>Опыт футболистам:</b> 200%<li> <b>Участники:</b><div style='text-color:#808080;'><img src=http://img.11x11.ru/images/vip/1.gif title=VIP-1 border=0 align=absmiddle> <a href=/users/1162508>Studio Neopixel</a> [2], <img src=http://img.11x11.ru/images/vip/1.gif title=VIP-1 border=0 align=absmiddle> <a href=/users/1024340>Манкунианцы</a> [2], <a href=/users/1111091>Team 2000</a> [2], <a href=/users/1131952>Sanyamba OiOiOi</a> [2], <a href=/users/1091744>Nell</a> [2], <a href=/users/1144478>kama2007</a> [2], <a href=/users/649301>kostyajuve</a> [2], <a href=/users/1167982>НОЛА</a> [2], <a href=/users/1079793>goshak</a> [2], <a href=/users/1134896>Шахтар Конотоп</a> [2], <a href=/users/1153154>FC Chita1978</a> [2], <a href=/users/1142245>masterdj</a> [2], <a href=/users/1074376>oukb34rus</a> [1], <a href=/users/1146091>Olegan059</a> [2], <a href=/users/1160340>Ramzay</a> [2], <a href=/users/1104367>franc87</a> [2], <a href=/users/1146681>revun</a> [2], <a href=/users/1150390>Ace me</a> [2], <a href=/users/1106890>NEXSUS007</a> [2], <a href=/users/867456>агро</a> [2], <a href=/users/1092127>Goal4win</a> [2], <a href=/users/569525>Palivo</a> [2], <a href=/users/1050513>DarkSithh</a> [2], <a href=/users/1159356>Big Pussy</a> [2], <a href=/users/1146657>Головастик</a> [2], <a href=/users/1162559>ФК_Захаров</a> [2], <a href=/users/1150710>Campeone</a> [2], <a href=/users/1164571>ser_vydy</a> [2], <a href=/users/737445>lukin</a> [2], <a href=/users/1158351>300_спартанцев</a> [2], <a href=/users/1121495>Elvis</a> [2], <a href=/users/1116768>Tezaur</a> [2], <a href=/users/699626>Kostik</a> [2], <a href=/users/1119587>FC Min-Vodi</a> [2], <a href=/users/964257>Honda</a> [2], <a href=/users/1123827>ilya_063</a> [2], <a href=/users/1164206>Carlos Digolas</a> [2], <a href=/users/1162052>FK_КУБАНЬ</a> [2], <a href=/users/865315>rHuga</a> [2], <a href=/users/691581>-AMKAP</a> [2], <a href=/users/1157737>UDAV</a> [2], <a href=/users/1083712>кривоногие мастера</a> [2], <a href=/users/1133280>gorokhov</a> [2], <a href=/users/1142904>Kireevsk</a> [2], <a href=/users/831618>AstaxOFF</a> [2], <a href=/users/1148913>NomadSTI</a> [2], <a href=/users/1169494>syava205</a> [2], <a href=/users/1125857>Fonakkz</a> [2], <a href=/users/1092961>ADor</a> [2], <a href=/users/1084072>Veliton Team</a> [2], <a href=/users/1034049>Paulo Maldini</a> [2], <a href=/users/1120628>Hesus77</a> [2], <a href=/users/1092822>robocop</a> [2], <a href=/users/1104672>ЛФК Эконом</a> [2], <a href=/users/1157637>serwer3000</a> [2], <a href=/users/1162500>vbctdbx</a> [2], <a href=/users/385760>УГНТУ</a> [2], <a href=/users/1168933>Italia-Juventus</a> [2], <a href=/users/1158407>Тутанхамон15</a> [2], <a href=/users/1164181>AlexUstaZZ</a> [2], <a href=/users/1156742>DINAMO BATUMI</a> [2], <a href=/users/1112183>Юрбанбанан</a> [2], <a href=/users/943444>Bingo1</a> [2], <a href=/users/1041527>ZYMA</a> [2]</div> Процедура получения исходника страницы происходит элементарно: memo1.text := idhttp.get() А получить мне надо только имя пользователя (для примера - <a href=/users/1146681>revun</a>, надо получить revun) В "регулярках" и прочих хитростях не силен. Помогите, кто чем горазд =)
Делфи не знаю, попытался переделать с си++ билдера stroka:AnsiString; user:AnsiString; stroka := idhttp.get(); while(stroka.Pos("<a href=/users/")) begin stroka.Delete(1, stroka.Pos("<a href=/users/")); stroka.Delete(1, stroka.Pos(">")); memo1.clear(); memo1.lines.add(stroka.SubString(1, stroka.Pos("<") - 1)); end; в мемо1 получишь список всех юзеров
Я, как настоящий ламер ( потому что я тоже не силен в регулярках), написал бы что - то вроде этой процедуры: Code: procedure TForm1.Button1Click(Sender: TObject); var strText:string; begin strText:=memo1.text; memo1.Text := ''; while pos('<a href=/users/',strText) <> 0 do begin delete(strText,1,pos('<a href=/users/',strText)); memo1.Text := memo1.Text + copy(strText,pos('>',strText)+1,pos('<',strText)-pos('>',strText)-1)+#13#10; end; end; Результат работы: Code: Studio Neopixel Манкунианцы Sanyamba OiOiOi Nell НОЛА goshak Шахтар Конотоп FC Chita1978 oukb34rus Olegan059 franc87 revun Ace me NEXSUS007 Goal4win Palivo DarkSithh Big Pussy lukin Tezaur FC Min-Vodi Honda Carlos Digolas ну и тд =)...
По моему вариант от Dosia оптимальный. С регулярками не советую работать, - процедура, как и сама программа, будет выполняется медленнее.
Chrome~ ну конечно, регулярки вообще какой то идиот придумал, настоящие трукодеры прогоняют массив процедурами и в каждой интерации цикла убирают ненужный текст. Садись два
Chrome~, не на много медленнее. почти не заметно. Spyder, я писал бекдор - делал примерно как Dosia, ибо регулярки больше 100 кб кода занимают. так что всё зависит от конкретного случая.
Ты прям отличник получается? Что бы применить регулярные выражения в Delphi нужно подключать модуль TRegExpr, благодаря которому сильно увеличивается размер программы. Я не особо работал в PHP и вообще не работал в Perl, но раз многие используют регулярки в этих языках, - у меня нет ничего против. Но регулярки в Delphi немного... неправильно. Помню, что на официальном сайте компонента было написано, что софт, который использует TRegExpr должен быть бесплатным. И все таки, подключать столь большую библиотеку ради этого дела наверное не стоит.
читаем http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1062 и делаем выводы =\ хром завтра на ачат без родителей не приходи mr.The касательно скорости, не знаю как в TRegExpr, но Regex (класс в .NET) позволяет собирать регулярку с ключем Compiled. Единожды она компилится и все. Увеличение производительности 10-15%. В твоем случае регулярка больше 100 строк кода? о_О эммм.. ты чего парсил?)))) Compiled - http://habrahabr.ru/blogs/net/50413/
Честно говоря, не знал об этом, спасибо тебе, обязательно почитаю. === Если еще раз перечитать наш разговор, можно заметить, что античат, - это та же школа. Один раздает двойки, другой вызывает родителей...
0_о однако. незнаю, я писал на с++, и там единственным вариантом было убрать это в длл. так как мне это всё-равно не подходило, я решил поизвращаться.