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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 26.03.2012, 22:50
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вариаций можно придумать много, ещё в RxLib готовые функции для этого были. Главное эффективность и простота.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #17  
Старый 15.11.2012, 16:42
vbv vbv вне форума
Прохожий
 
Регистрация: 10.03.2010
Сообщения: 6
Репутация: 10
По умолчанию

А как найти "0123.45" xx в строке <a href="#nodo" onclick="page.userData.refresh(true);">0123.45 xx</a> если "0123.45 хх" это переменное значение.
Ответить с цитированием
  #18  
Старый 15.11.2012, 17:08
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vbv
А как найти "0123.45" xx в строке <a href="#nodo" onclick="page.userData.refresh(true);">0123.45 xx</a> если "0123.45 хх" это переменное значение.
Если "0123.45 хх" это единственное что в этой строке меняется то можно таким образом:
Код:
  ShowMessage(Copy(s, 56, Length(s) - 59)); // где s это переменная с этой строкой
Ответить с цитированием
  #19  
Старый 15.11.2012, 19:24
vbv vbv вне форума
Прохожий
 
Регистрация: 10.03.2010
Сообщения: 6
Репутация: 10
По умолчанию

Вот этот код подходит
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 KP, KS : Integer;
 S, Word : string;
 begin
 S := RichEdit1.text;
 KP := Pos('<a href="#nodo" onclick="page.userData.refresh(true);">', S);
 KS := Pos('</a>', S);
 while KP > 0 do begin
 Word := Copy(S, KP+55, KS-KP-55);
 ShowMessage(Word);
 Inc(KP); KP := PosEx('<a href="#nodo" onclick="page.userData.refresh(true);">', S, KP);
 Inc(KS); KS := PosEx('</a>', S, KS);
 if KS = 0 then KS := Length(S)+1;
 end;
 end;
но! Если грузить в программу не весь файл(407 строк начиная с 407й). При полной подгрузке текста(700 строк)
Код:
ShowMessage
выдаёт пустое окошко.

На всякий случай исходник с текстом прикрепил.
Вложения
Тип файла: zip FIND_POS.zip (8.1 Кбайт, 6 просмотров)
Ответить с цитированием
  #20  
Старый 16.11.2012, 04:12
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vbv
но! Если грузить в программу не весь файл(407 строк начиная с 407й). При полной подгрузке текста(700 строк)
Код:
ShowMessage
выдаёт пустое окошко.
Если бы ты пользовался отладчиком и посмотрел какие значения получают переменные KP и KS, то и сам понял бы почему так происходит. Учись пользоваться отладчиком - незаменимая вещь в непонятных ситуациях.

Вот так будет правильнее и попроще:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  cs1: string = '<a href="#nodo" onclick="page.userData.refresh(true);">';
  cs2: string = '</a>';
var
  KP, KS: Integer;
  S, Word: string;
begin
  S := RichEdit1.text;
  KP := 1;
  while True do
  begin
    KP := PosEx(cs1, S, KP);
    if KP = 0 then Break;
    Inc(KP, Length(cs1));

    KS := PosEx(cs2, S, KP);
    if KS = 0 then Break;

    Word := Copy(S, KP, KS - KP);
    ShowMessage(Word);

    KP := KS + Length(cs2);
  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
vbv (16.11.2012)
  #21  
Старый 16.11.2012, 08:16
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

повторяющаяся тема, в целях обучения все способы хороши, даже посимвольный пробег по строке; самый краткий без регулярок, это функция, которая два раза вызывает delete; а для разнообразия можно сделать регулярками через CreateOLEObject
Код:
uses comobj;

function eval(command:string; lang:string='VBScript'): string;
var
  script: Variant;
begin
  script := CreateOLEObject('ScriptControl');
  try
    script.Language := lang;
    result := script.eval(command); // no match => error
  finally
    script := Unassigned;
  end;
end;

function match(given, regexp: string; index:integer=0): string;
const script = '"%s".match(%s)[%d];';
begin
  given := StringReplace(given, '\', '\\', [rfReplaceAll]);
  given := StringReplace(given, '"', '\"', [rfReplaceAll]);
  given := StringReplace(given, #13#10, '\n', [rfReplaceAll]);
  result := eval(format(script, [given, regexp, index]), 'JScript');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  ShowMessage('full:'#13#10+ match(given.Text, '/<a href="#nodo".*?>(.+)<\/a>/'));
  ShowMessage('inner:'#13#10+ match(given.Text, '/<a href="#nodo".*?>(.+)<\/a>/', 1));
  ShowMessage('other:'#13#10+ match(given.Text,'/<a href="#nodo"(.*?)>.+<\/a>/', 1));
end;
__________________
>woweook<
Ответить с цитированием
Этот пользователь сказал Спасибо Pyro за это полезное сообщение:
vbv (16.11.2012)
  #22  
Старый 16.11.2012, 08:49
vbv vbv вне форума
Прохожий
 
Регистрация: 10.03.2010
Сообщения: 6
Репутация: 10
По умолчанию

Всем спасибо за помощь! Всё получилось и отлично работает.
Выкладываю исходник клиента QIWI кошелька (может кому то пригодится), пока только проверка балланса.
Вложения
Тип файла: zip Ballance.zip (607.1 Кбайт, 2 просмотров)
Ответить с цитированием
  #23  
Старый 16.11.2012, 10:21
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Pyro
повторяющаяся тема, в целях обучения все способы хороши, даже посимвольный пробег по строке;
Согласен. На своих ошибках лучше запоминается.
Цитата:
Сообщение от Pyro
самый краткий без регулярок, это функция, которая два раза вызывает delete;
И всё же лучше один раз Copy чем два раза Delete.
Цитата:
Сообщение от Pyro
а для разнообразия можно сделать регулярками через CreateOLEObject
В регулярках я пас...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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