Есть код на python для "парсинга" заголовка. Code: import urllib.request urlopen from re import findall as fa #Библиотека регресных выражений url = "http://ram.by" htmltext = urlopen(url).read().decode() #грубо говоря открытие и чтение f = fa(r'<title>(.*?)</title>', htmltext) #находит все между тегами title for title in f: print(title) Как парсить на Delphi ? Как работать с регресными выражениями ?
начиная с версии XE: Code: uses ..., RegularExpressions; .................. var regex : TRegEx; htmltext : string; matches : TMatchCollection; i : integer; begin ..... ..... regex := TRegEx.Create('<title>(.*?)</title>'); matches := regex.Matches(htmltext); for i := 0 to matches.Count-1 do writeln(matches[i].Groups.Item[1].Value);
Здравствуйте, не могу разобраться Incompatible types: 'Char' and 'String' Code: function only_alphabets(str:string):string; var buf:string; i:integer; begin buf:=''; for i:=1 to length(str) do if str[i] in ['a'..'Z'] then buf:=buf+str[i]; Result:=buf; end; var R:string; int:integer; begin R[Int]:=only_alphabets(Edit1.text[x.IntVal(Length(sEdit1.text))+1]);
Всем привет. Сильно тормозят обе формы при автозаполнении формы в TWebbrowser... Пробовал из потоков то же самое открываю form2 из form1 Code: Form1 ..... Form2.Show; Form2.BitBtn1Click(Sender); код form2: Code: procedure TForm2.BitBtn1Click(Sender: TObject); var WBThread: TWBThread; begin CoInitialize(nil); Label1.Caption:=Form2NameIP; Form2.Width := Round(Width1 /2.3); Form2.Height := Round(Height1 /1.5); WBThread:=TWBThread.Create(false); WBThread.FreeOnTerminate:=true; WBThread.Resume; CoUninitialize; ... procedure TForm2.WBDocumentComplete(ASender: TObject; const pDisp: IDispatch; const [Ref] URL: OleVariant); var i:integer; begin if (pDisp = CurDispatch) then begin CurDispatch := nil; {ќчищаем временную переменную} html_tag:=WB.OleObject.Document.getelementsbytagname('input'); For i:=0 To (html_tag.Length-1) Do Begin If (html_tag.item(i).id='username') Then html_tag.item(i).value:=login; If (html_tag.item(i).id='password') Then html_tag.item(i).value:=password; end; html_tag:=WB.OleObject.Document.getelementsbytagname('button'); For i:=0 To (html_tag.Length-1) Do Begin If (html_tag.item(i).id='loginBT') Then html_tag.item(i).click; end; WB.Show; // InvalidateRect(0, nil, True); end; end; procedure TForm2.WBNavigateComplete2(ASender: TObject; const pDisp: IDispatch; const [Ref] URL: OleVariant); begin if CurDispatch = nil then CurDispatch := pDisp; {IDispatch страницы котора¤ грузитс¤} //WB.OleObject.Document.Cookie:=CM.CookieCollection.Cookies[0].ClientCookie; // InvalidateRect(0, nil, True); end; procedure TWBThread.Execute; begin //Synchronize(OpenURL); Form2.WB.Navigate(PChar('http://'+Form2NameIP)); Form2.WB.Hide; end; подскажите пж что можно сделать?
Фризить может где угодно, отладчик в руки и дебажить по строчке. При правильном использовании потоков, WndProc главной формы не может тормозить. Убери все обращения к элементам формы из ThreadProc и проверь.
Здравствуйте как поменять у ip предпоследние цифры перед точкой Code: например сделать +4 цифры перед последней точкой: 94.130.12.146 //оригинал 94.130.16.146 //+4 5.189.133.153 //оригинал 5.189.137.153 //+4 194.243.192.60 //оригинал 194.243.196.60 //+4
вот тебе идея : сплить по точке и прибавляй к 3 числу +4, потом собирай обратно результат. Насколько я помню, сплита в делфи нету, можешь вместо него использовать регулярку, суть та же
Так вот использовал проблема регулярки заключалась что точки 3 и она находит значение между первой и второй точкой
Code: program Project1; {$APPTYPE CONSOLE} uses System.SysUtils; type TStrArray = array of string; function Explode(Delimiter : string; Str : string) : TStrArray; var s : string; begin SetLength(Result, 0); s := Str; while Pos(Delimiter, s) > 0 do begin SetLength(Result, Length(Result) + 1); Result[High(Result)] := Copy(s, 1, Pos(Delimiter, s) - 1); Delete(s, 1, Pos(Delimiter, s) +Length(Delimiter) - 1); end; SetLength(Result, Length(Result) + 1); Result[High(Result)] := s; end; function Implode(Delimiter : string; Pieces : TStrArray) : string; var i : integer; begin result := ''; for i := 0 to High(Pieces) do begin result := result + Pieces[i]; if i <> High(Pieces) then result := result + Delimiter; end; end; var ip : string; a : TStrArray; begin ip := '94.130.12.146'; writeln(ip); a := Explode('.', ip); a[2] := IntToStr(StrToInt(a[2]) + 4); ip := Implode('.', a); writeln(ip); writeln(''); ip := '5.189.133.153'; writeln(ip); a := Explode('.', ip); a[2] := IntToStr(StrToInt(a[2]) + 4); ip := Implode('.', a); writeln(ip); writeln(''); ip := '194.243.192.60'; writeln(ip); a := Explode('.', ip); a[2] := IntToStr(StrToInt(a[2]) + 4); ip := Implode('.', a); writeln(ip); writeln(''); readln; end.
Как взять следующую или конечную строку разделённую , ? Code: Source:='123,668,352,1055'; Source:=copy(Source,1,pos(',',Source)-1); showmessage(Source); // Только первый символ перед запятой и циклом не выходит :-(
Нет смотри: Code: procedure TForm1.Button1Click(Sender: TObject); var R:string; begin R:='123,668,352,1055'; while pos(',',R)<>0 do R:=StringReplace(R, ',',#13#10,[]); // разбиваю на строки Showmessage(R[1]); // Результат 1 символ первой строки, а мне нужно целиком строки [1] [2] и тд end; А применять memo или tstringlist не хочется
В одной строке невозможно иметь несколько строк, создавай массив тогда. Без TStringList не получится просто взять, и разделить текст переносами строк.
PHP: program Project2;{$APPTYPE CONSOLE}uses SysUtils;varsource,tmp:string;p,i,c:integer;beginsource:='123,668,352,1055';tmp:=source;while i<>0 dobegin i:=pos(',',tmp); if i<>0 then begin delete(tmp,1,i); inc(c); end; end;writeln('Data: '+source);writeln('Kol-vo elementov: ',c+1);tmp:=source;for i:=1 to c do begin p:=pos(',',tmp); Writeln('Element #',i,': ',copy(tmp,1,p-1)); Delete(tmp,1,p); end; Writeln('Element #',c+1,': ',tmp);readln;end.