![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как же выдрать нужный кусочем html кода. [D7, WinXP]
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 конечно же. как же еще