-
Добрый вечер уважаемые. Выполняю запрос методом 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>
и подкорректировать в ней данные.... Кто сталкивался? Как реализовать? Спасибо и премного благодарен.
-
> Мне необходимо из всего HTML кода выдернуть табличку
Pos() + Copy() - выдернуть можно все что угодно.
-
-
> и подкорректировать в ней данные....
с какой целью? я к тому, что на сервере ничего не измениться...
-
> Separator
Да действительно удобно, единственное не могу понять как к коде: r := TRegExpr.Create;
try
r.Expression := 'ТУТ ВЫРОЖЕНИЕ';
if r.Exec (S) then S:=r.Match [0];
finally r.Free;
end; перебрать все содержащиеся в тексте подстроки удовлетворяющие r.Expression, у меня r.Match [0]; содержит первое найденное? r.Match [1] ничего не содержит.... ((
-
Прошу прощения за лишнее беспокойство, наткнулся:
REPEAT r.Match [0] UNTIL not r.ExecNext;
-
А вот этот вопрос не получилось решить.... Как в REPEAT
r.Match [0]
UNTIL not r.ExecNext; заменить найденную строку r.Match [0] на свой текст, может средствами TRegExpr это можно сделать?
-
Там же есть функция Replace
-
> Там же есть функция Replace
Что то не могу понять как работает, Replace надо использовать отдельно от r.Exec? Или можно в цикле: REPEAT
r.Match [0]
r.Replace(r.Match [0],'то на что меняем')
UNTIL not r.ExecNext; ??
-
Экспрешшен то перед реплэйсом поменять надо.
-
Использовать отдельно, без Exec
-
либо он весь мач поменяет разом. кроме того реплейс - это функция
-
либо вообще ничего не поменяет ибо внутри мача вполне может не оказаться ничего, что бъет с выражением по которому найден сам этот мач.
-
Реализовал: r:=TRegExpr.Create;
try
r.Expression := ' [0-9][.][0-9]';
S:=r.Replace(S,'66.666',false);
finally
r.free;
end; Но не понимаю как реализовать замену всех искомых сумм не на фиксированное значение '66.666', а на произведение например, то есть в место 0.001 получить везде 0.001*2?
-
а что, проблема умножить найденную сумму (переведя ее сначала к double) на два и привести резалт обратно к строке для использования в реплейсе?
-
> а что, проблема умножить найденную сумму (переведя ее сначала > к double) на два и привести резалт обратно к строке для > использования в реплейсе? >
Это ясно, что переводить то? Как сослаться на эту сумму в коде: r:=TRegExpr.Create; try r.Expression := ' [0-9]{1,}[.][0-9]{2}'; S:=r.Replace(S,'66.666',false); finally r.free; end; ?
-
Ну странный ты однако. Ты что вообще реплейсишь? По моему это переменная S.
Ты спрашиваешь как сослаться на переменную?
-
S содержит результат GET запроса. В S надо произвести арифметические операции над каждым числом вида [0-9]{1,}[.][0-9]{2}. Вот мне и надо не просто РЕПЛЕЙСИТЬ все такие значения, а РЕПЛЕЙСИТЬ из умноженными на 0,5 например. Как мне сослаться на каждую сумму типа [0-9]{1,}[.][0-9]{2} для перевода ее в double?
-
ну так найди все вхождения подстрок - сумм. затем обработай.
-
Как мне сослаться на каждую сумму типа [0-9]{1,}[.][0-9]{2} для перевода ее в double?
через match конечно же. как же еще
-
Match и Replace не получается использовать одновременно, поэтому то и спрашивал как при переборе заменить найденные значения содержащиеся в Match[0]?
-
Найденное значение содежится в матче. Это тебе готовый новый экспрешшен для реплейса.
-
Ну или в конце концов у найденного матча есть матчпоз и матчлен.
-
Хернёй не страдайте, зачем давать бесполезные ответы, если человеку нужно определённое решение?
Поищите в исходниках такую строку: TRegExprReplaceFunction Всё уже реализовано и можно реплайсить на динамическое значение
-
добавлю одно но: все хорошо с заменой, если текст из [0] повторятся один раз, а если не один? ;) Вот еслиб
> <table class="callstable"
был бы уникальным и использовался один раз на странице (что врядли), вот тогда все гуд) зы делал подобное для сайта погоды... подводных камней - куча! Автору - удачи)
-
Поищите в исходниках такую строку: TRegExprReplaceFunction
И чего? Чем она поможет, если ему все найденное надо приводить к дабл и умножать на два?
-
> Медвежонок Пятачок © (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
public
function RegE(aRegExpr : TRegExpr): string;
end;
var
Form8: TForm8;
implementation
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;
-
Вот честно, после всяких приведённых ответов на языке вертятся только неопределённые суффиксы: бля и мать вашу. Какого хрена не разобравшись даёте такие уверенные ответы? Исходники открыты, читайте, разбирайтесь и используйте.
-
Как видим задача решена полностью.
не тормози, сникерсни. ему не просто найти надо, а заменить найденное на умноженное на два.
-
Допустим в исходном тексте есть '2' и '4' Обрабатываем '2' описанным выше образом и заменяем все го вхождения на '4' Затем встречаем в тексте '4', которое надо заменить на '8'. И тут понимаем, что кроме исходных '4' у нас появились '4' в результате предыдущего шага. А их менять не неадо.
-
Менять в обратном порядке: 4 на 8, 3 на 6, 2 на 4, 1 на 2, в чем проблема?
-
проблема в том, что порядок следования искомых чисел надо сначала где-т о взять
-
А где в постановке задачи были вообще такие условия? Может не стоит придумывать (додумывать) за автора вопроса? Я вроде написал, задача решена. В чём проблема? Подставте в мой пример рег. выражение данное автором и попробуйте запустить, уверяю вас, что всё отработает так как нужно и не будет ни каких левых замен. Давайте дождемся ответа автора вопроса? Если его не будет, значит он уже решил проблему, так что нечего плодить ответы.
-
А где в постановке задачи были вообще такие условия?
Предлагаю, прежде чем петушиться и орать о найденном решении решении, подумать.
А для начала найди в исходном тесте своим выражением самое большое число, с которого требутеся начать замену.
-
А где в постановке задачи были вообще такие условия?
1.Выполняю запрос методом GET получаю в текстовую переменную
2.как реализовать замену всех искомых сумм не на фиксированное значение '66.666', а на произведение например, то есть в место 0.001 получить везде 0.001*2?
Итого: исходный текст заранее неизвестен. и в нем нужно искать числа и заменять их на функцию от найденного числа.
Вот тебе и "а где в условии сказано"
-
Зачем искать самое большое число? Зачем производить множество замен? Функция 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;
-
Вместо умножения на 2 можно производить любые действия над данным числом
-
ну и как же ты на очередной итерации замены "4" на "16" ты отсечешь четверки, которые есть результат уже свершившейся замены двоек на четверки?
-
Какая очередная итерация? Все делается за один проход!!!
|