Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2011, 23:00   #1
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию Regex.Groups кто знаком?

Нашел вот этот код в сети:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    eLogin: TEdit;
    eMail: TEdit;
    ePass: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses
  PerlRegEx, httpsend, StrUtils, HTTPApp, Math, synacode, unit2, jpeg;

function GetTargetURL(const aHeaders: TStringList): string;
var
  i: integer;
begin
  Result := '';
  if aHeaders = nil then
    Exit;
  for i := 0 to aHeaders.Count - 1 do
  begin
    if pos('location:', LowerCase(aHeaders[i])) > 0 then
    begin
      Result := copy(aHeaders[i], 11, length(aHeaders[i]) - pos('location:', LowerCase(aHeaders[i])));
      break;
    end;
  end;
end;

function GetHTTPStr(http: THTTPSend): string;
var
  BodyStream: TStringStream;
  BodyS: TStringList;
begin
  try
    BodyS := TStringList.Create;
    BodyStream := TStringStream.Create(result);
    begin
      BodyS.LoadFromStream(http.Document);
      result := BodyS.Text;
    end;
  finally
    BodyStream.Free;
    BodyS.Free;
  end;
  http.Document.Seek(0, soFromBeginning);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  http: THTTPSend;
  params: string;
  str: string;
  Regex: TPerlRegEx;
  captchaid, captcha: string;
begin
  http := THTTPSend.Create;
  Regex := TPerlRegEx.Create(nil);
  Regex.RegEx := '<input type=hidden name="captchaid" value="(.+?)">';
  Regex.Options := [];
  http.HTTPMethod('GET', 'http://moemesto.ru/register/');
  str := GetHTTPStr(http);
  Regex.Subject := str;
  if Regex.Match then
    captchaid := Regex.Groups[1]
  else
    exit;
  Regex.RegEx := '<img alt="captcha" src="(.+?)" class="captcha">';
  if Regex.Match then
    captcha := Regex.Groups[1]
  else
    exit;
  http.Document.Clear;
  http.Headers.Clear;
  http.HTTPMethod('GET', 'http://moemesto.ru' + captcha);
  http.Document.SaveToFile(ExtractFilePath(Application.ExeName) + '\cathca.jpg');
  Form2.Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + '\cathca.jpg');
  Form2.ShowModal;
  if trim(Form2.eCaptcha.Text) = '' then exit;
  captcha := trim(Form2.eCaptcha.Text);
  params := 'captchaid=' + captchaid + '&login=' + eLogin.Text + '&email=' + eMail.Text + '&password=' + ePass.Text + '&captcha=' + captcha + 
'&do_reg=%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%D1%81%D1%8F';
  http.Document.Clear;
  http.Headers.Clear;
  HTTP.MimeType := 'application/x-www-form-urlencoded';
  HTTP.Document.Write(Pointer(Params)^, Length(Params));
  HTTP.HTTPMethod('POST', 'http://moemesto.ru/register/');
  if HTTP.ResultCode <> 200 then
  begin
    MessageDlg('Ошибка выполнения запроса', mtError, [mbOK], 0);
    Exit;
  end;
  str := GetHTTPStr(http);
  if Pos('a href="?logout=1"', str) = 0 then
  begin
    MessageDlg('Ошибка, не зарегистрировались', mtError, [mbOK], 0);
    Exit;
  end;
  FreeAndNil(http);
end;

end.
На captchaid := Regex.Groups[1] выдает ошибку, неверный индентификатор. В чем может быть проблема?

Последний раз редактировалось mihali4; 02.11.2011 в 15:05.
Зод вне форума Ответить с цитированием
Старый 22.09.2011, 19:05   #2
Upgrades
Пользователь
 
Аватар для Upgrades
 
Регистрация: 19.07.2010
Сообщений: 21
По умолчанию

property Groups[Index: Integer]: UTF8String read GetGroups;

Description

Matched groups after a regex has been matched.

Цитата:
Groups[0] = MatchedText
The item count in the Groups array increases with one for every opening bracket in the regex. The text matched by the part of the regex between that opening bracket and its corresponding closing bracket, will be put in the Groups array.

Valid range for Index is 0..GroupCount. Note that GroupCount need not be equal to the number of opening brackets, since it may happen that only part of the regular expression played a role in the current match.

If you used named capturing groups in the regular expressions, use the NamedGroup method to retrieve the index number of a named group.

Run-time and read-only.

Из справки Delphi XE к TPerlRegEx

Видать надо captchaid := Regex.Groups[0] писать, либо captchaid := Regex.MatchedText

Последний раз редактировалось Upgrades; 22.09.2011 в 19:11.
Upgrades вне форума Ответить с цитированием
Старый 28.09.2011, 18:19   #3
Зод
Форумчанин
 
Регистрация: 25.08.2011
Сообщений: 140
По умолчанию

Из-за разницы версий PerlReg следует писать Regex.SubExpressions[0] вместо Regex.Groups[0]
Там нужно смотреть версию продукта и выставлять нужную строчку.
Нашел давно вот решил написать может кто столкнется с этой проблемой и будет искать.
Зод вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто хорошо знаком SPSS? re461xo Помощь студентам 1 24.10.2013 10:55
Нужен кто знаком с переносом CMS Antoxa-sm Фриланс 2 06.06.2011 15:08
кто нибудь знаком с классом? BESS Microsoft Office Word 1 10.08.2008 12:15
Кто нибудь знаком с BP-WIN ? SM1TH Помощь студентам 1 12.04.2007 20:28