Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как же выдрать нужный кусочем html кода. [D7, WinXP]


Страницы:   1 2

Lamer6666 ©   (2009-11-11 22:53:00) 

Добрый вечер уважаемые.
Выполняю запрос методом GET получаю в текстовую переменную S HTML код.
Мне необходимо из всего HTML кода выдернуть табличку

<table class="callstable" cellpadding="2" cellspacing="0"  width=500>
<tr>
<td style="border-bottom: 1px solid black; font-weight: bold;">Date</td><td style="border-bottom: 1px solid black; font-weight: bold;"> </td>
  <td style="border-bottom: 1px solid black; font-weight: bold;">Time</td>
 
     
  <td style="border-bottom: 1px solid black; font-weight: bold;"> </td>
  <td style="text-align: left; border-bottom: 1px solid black; font-weight: bold;">Pole1</td>
  <td style="border-bottom: 1px solid black; font-weight: bold;"> </td>

  <td style="text-align: left; border-bottom: 1px solid black; font-weight: bold;">Pole2</td>
  <td style="border-bottom: 1px solid black; font-weight: bold;"> </td>
  <td style="text-align: left; border-bottom: 1px solid black; font-weight: bold;">Pole3</td>
  <td style="border-bottom: 1px solid black; font-weight: bold;"> </td>
 </tr>

Далее пошли строки <tr></tr> с данными.... для выше приведенных заголовков

</table>

и подкорректировать в ней данные....
Кто сталкивался? Как реализовать?
Спасибо и премного благодарен.


Separator   (2009-11-23 11:43:00) [1]

Какая очередная итерация? Все делается за один проход!!!


Медвежонок Пятачок   (2009-11-23 11:41:00) [2]

ну и как же ты на очередной итерации замены "4" на "16" ты отсечешь четверки, которые есть результат уже свершившейся замены двоек на четверки?


Separator   (2009-11-23 11:07:00) [3]

Вместо умножения на 2 можно производить любые действия над данным числом


Separator   (2009-11-23 11:06:00) [4]

Зачем искать самое большое число? Зачем производить множество замен? Функция ReplaceEx позволяет работать над каждым найденным значением отдельно и она продолжит искать по исходной строке, которая не подвергнется изменениям, пока не будет закончена вся замена, если заглянете в реализацию ReplcaeEx, то заметите, что там не производятся замены над исходной строкой, а результатом будет простое объединение не попадающих под выражение частей строки и результатов переданной функции.
Вот ещё раз привожу пример работы:
исходная  строка, куча цифр: 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 9
регулярное выражение: ([\d]+)
результат, каждое найденное число умножено на 2: 20 22 24 26 28 30 32 34 36 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 2 4 6 8 10 12 14 16 18
Никаких коллизий не обнаружено, каждое число как ему и полагалось, умножено на 2. Что еще требуется?
вот код:

procedure TForm8.btn1Click(Sender: TObject);
var
mRegE: TRegExpr;
begin
mRegE := TRegExpr.Create;
try
  mRegE.Expression := edt1.Text;
  mmo2.Lines.Add(mRegE.ReplaceEx(mmo1.Lines.Text, RegE));
finally
  mRegE.Free;
end;
end;

function TForm8.RegE(aRegExpr: TRegExpr): string;
begin
 Result := FloatToStr(StrToFloatDef(aRegExpr.Match[0], 0) * 2);
end;


Медвежонок Пятачок   (2009-11-23 10:56:00) [5]

А где в постановке задачи были вообще такие условия?

1. Выполняю запрос методом GET получаю в текстовую переменную

2. как реализовать замену всех искомых сумм не на фиксированное значение '66.666', а на произведение например, то есть в место 0.001 получить везде 0.001*2?

Итого: исходный текст заранее неизвестен.
и в нем нужно искать числа и заменять их на функцию от найденного числа.

Вот тебе и "а где в условии сказано"


Медвежонок Пятачок   (2009-11-23 10:49:00) [6]

А где в постановке задачи были вообще такие условия?

Предлагаю, прежде чем петушиться и орать о найденном решении решении, подумать.

А для начала найди в исходном тесте своим выражением самое большое число, с которого требутеся начать замену.


Separator   (2009-11-23 10:40:00) [7]

А где в постановке задачи были вообще такие условия? Может не стоит придумывать (додумывать) за автора вопроса? Я вроде написал, задача решена. В чём проблема? Подставте в мой пример рег. выражение данное автором и попробуйте запустить, уверяю вас, что всё отработает так как нужно и не будет ни каких левых замен.
Давайте дождемся ответа автора вопроса? Если его не будет, значит он уже решил проблему, так что нечего плодить ответы.


Медвежонок Пятачок   (2009-11-23 10:28:00) [8]

проблема в том, что порядок следования искомых чисел надо сначала где-т о взять


Separator   (2009-11-23 10:22:00) [9]

Менять в обратном порядке: 4 на 8, 3 на 6, 2 на 4, 1 на 2, в чем проблема?


Медвежонок Пятачок   (2009-11-23 09:32:00) [10]

Допустим в исходном тексте есть '2' и '4'
Обрабатываем '2' описанным выше образом и заменяем все го вхождения на '4'
Затем встречаем в тексте '4', которое надо заменить на '8'.
И тут понимаем, что кроме исходных '4' у нас появились '4' в результате предыдущего шага. А их менять не неадо.


Медвежонок Пятачок   (2009-11-23 09:23:00) [11]

Как видим задача решена полностью.

не тормози, сникерсни.
ему не просто найти надо, а заменить найденное на умноженное на два.


Separator   (2009-11-23 07:01:00) [12]

Вот честно, после всяких приведённых ответов на языке вертятся только неопределённые суффиксы: бляи мать вашу. Какого хренане разобравшись даёте такие уверенные ответы? Исходники открыты, читайте, разбирайтесь и используйте.


Separator   (2009-11-23 06:50:00) [13]


> Медвежонок Пятачок ©   (16.11.09 09:07) [25]
>
> И чего?

А может стоило всё-таки разобраться?
Вот исходная строка: n1sad n2dsa n3ds n4sd n5as
Вот регулярное выражение: (n)([\d]+)
А вот результат: n2sad n4dsa n6ds n8sd n10as
Как видим задача решена полностью.
Код решения:

type
 TForm8 = class(TForm)
   btn1: TButton;
   mmo1: TMemo;
   edt1: TEdit;
   mmo2: TMemo;
   procedure btn1Click(Sender: TObject);
 private
   { Private declarations }
 public
   function RegE(aRegExpr : TRegExpr): string;
 end;

var
 Form8: TForm8;

implementation

{$R *.dfm}

{ TForm8 }

procedure TForm8.btn1Click(Sender: TObject);
var
 mRegE: TRegExpr;
begin
 mRegE := TRegExpr.Create;
 try
   mRegE.Expression := edt1.Text;
   mmo2.Lines.Add(mRegE.ReplaceEx(mmo1.Lines.Text, RegE));
 finally
   mRegE.Free;
 end;
end;

function TForm8.RegE(aRegExpr: TRegExpr): string;
begin
 Result := aRegExpr.Match[1] + FloatToStr(StrToFloatDef(aRegExpr.Match[2], 0) * 2);
end;


Медвежонок Пятачок   (2009-11-16 09:07:00) [14]

Поищите в исходниках такую строку: TRegExprReplaceFunction

И чего?
Чем она поможет, если ему все найденное надо приводить к дабл и умножать на два?


brother   (2009-11-16 07:29:00) [15]

добавлю одно но:
все хорошо с заменой, если текст из [0] повторятся один раз, а если не один? ;)
Вот еслиб

> <table class="callstable"

был бы уникальным и использовался один раз на странице (что врядли), вот тогда все гуд)
зы делал подобное для сайта погоды... подводных камней - куча!
Автору - удачи)


Separator   (2009-11-16 06:17:00) [16]

Хернёй не страдайте, зачем давать бесполезные ответы, если человеку нужно определённое решение?

Поищите в исходниках такую строку: TRegExprReplaceFunction
Всё уже реализовано и можно реплайсить на динамическое значение


Медвежонок Пятачок   (2009-11-14 19:46:00) [17]

Ну или в конце концов у найденного матча есть матчпоз и матчлен.


Медвежонок Пятачок   (2009-11-14 17:17:00) [18]

Найденное значение содежится в матче.
Это тебе готовый новый экспрешшен для реплейса.


Lamer6666   (2009-11-14 10:56:00) [19]

Match и Replace не получается использовать одновременно, поэтому то и спрашивал как при переборе заменить найденные значения содержащиеся в Match[0]?


Медвежонок Пятачок   (2009-11-14 02:24:00) [20]

Как мне сослаться на каждую сумму типа  [0-9]{1,}[.][0-9]{2} для перевода ее в double?

через match конечно же. как же еще


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо