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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2009, 11:28   #1
XazzzI
 
Регистрация: 13.06.2009
Сообщений: 5
Вопрос Помогите вытянуть нужный текст из memo

Здраствуйте все !
У меня такая проблемка : в memo1 лежит код html странички , полученый из TWebBrowser . В этом коде регулярно повторяются промежутки типа :

Код HTML:
<tr>
<td align='center'>ХХХХХ</td>
<td align=center><a href='index2.php?cf=akk-plus2&mid=ХХХХХ'>текст произвольной длинны</a></td>
<td align=center>Х.ХХХ</td>
<td align=center>ХХ.ХХ.ХХХХ</td>
<td align=center><a href='index2.php?cf=akk-delete2&sid=ХХХХХХХХ' onclick='if (!confirm("Вы уверены?"))return false;'><img src='/i/delete.gif' alt='Удалить' width='15' height='15' border='0'></td>
</tr>
Там где ХХХ вместо иксов могут быть любые цыфры , также текст тоже может быть любой , и раз чеез раз самый первый тег меняется на <tr id='bgtbldark'> . Из этих блоков мне нужно вытащить : адрес ссылки и ее текст , и то число , которое идет сразу за ссылкой , вида Х.ХХХ . Слышал , что это както можно сделать при помощи регулярных выражений , но как ? или может есть метод попроще ? подскажите мне пожалуйста .

Последний раз редактировалось Stilet; 15.06.2009 в 08:56.
XazzzI вне форума Ответить с цитированием
Старый 13.06.2009, 11:40   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Можно и просто функциями:
1. Ищет в Мемо от указанного смещения фрагмент строки <tr
2. Отсчитывает от указанного смещения нужное количество строк и извлекает из строки название ссылки
3. Отсчитывает от указанного смещения нужное количество строк и извлекает из строки ссылку
Что-то в этом роде.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 13.06.2009, 11:48   #3
XazzzI
 
Регистрация: 13.06.2009
Сообщений: 5
По умолчанию

хорошо , но как это реализовать на практике ?
1. Ищет в Мемо от указанного смещения фрагмент строки <tr
но ведь в файле не только нужные мне строки начинаются на <tr !
2. Отсчитывает от указанного смещения нужное количество строк и извлекает из строки название ссылки
опять же , допустим мы нашли какой-то левый тр , тогда все закончится дефолтом . Да и извлечь адрес ссылки немного проблематично , как по мне ...
ладно , попробую организовать что-то подобное ... но все-же , проблема с поиском и доставанием нужного остается открытой ...
XazzzI вне форума Ответить с цитированием
Старый 13.06.2009, 11:54   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

1. После <tr пусть ищет <td align='center'> в следующей строке, а в следующей строке <td align=center>. Мало? Пусть дальше заглянет.
Это не проблема, у тебя все упирается только в смещение в Memo.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 13.06.2009, 12:30   #5
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

XazzzI, почитай про функцыи Pos, PosEx и Copy.. с их помощью ты можешь реализовать парсер любой сложности..

Цитата:
1. Ищет в Мемо от указанного смещения фрагмент строки <tr
но ведь в файле не только нужные мне строки начинаются на <tr !
перед нужным тебе блоком должно быть какоето выражение которое всегда одинаково.. находи его и от него ищи уже нужный тебе блок
или второй вариант:
Цитата:
допустим мы нашли какой-то левый тр , тогда все закончится дефолтом
обьявляем свою струкруту.. и переменную этой структуры.. находим поле <tr предпологаем чсто оно то что нам нужно.. и начинаем от него отщитывать все смещения и ссылки для заполнения одного дблока.. если в конце блока переенная нашей структуры заолнена не полностью - значит это "левый" блок.. очищиаем переменную.. переходим к следующему блоку..

если "левый" блок меньше "нужного" - то нужно делать дорполнительно проверку на окончание блока..
удачи
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 13.06.2009, 18:00   #6
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Я бы посоветовал так:
Так как в делфи строки длиной до 2Гб советую все, что между тегами <tr> и </tr> запихнуть в одну строку (так не нужно будет мучаться с переходами на новую строку в memo)
Далее при помощи pos("</a>",s) ищем конец ссылки. Смещаемся в лево по строке, пока не встретим ">" при помощи copy(s,позиция символа >,pos("</a>",s)-позиция символа+1) находим текст ссылки.
Далее все просто: с pos("</a>",s)+3 ищем открывающий тег > и идем до закрвыающего </td>. Вот вам и X.XXX
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 14.06.2009, 03:08   #7
IceExecutioner
Пользователь
 
Аватар для IceExecutioner
 
Регистрация: 04.06.2009
Сообщений: 26
По умолчанию

можно попробовать использовать
Код:
function AnsiPos(const Substr: string; const S: string): Integer;
, где Substr - это то что ты ищешь, S - строка в которой ты ищешь, данная функция вернёт номер позиции с которой начинается подстрока
Цитата:
Locates the position of a substring.

Pascal
function AnsiPos(const Substr: string; const S: string): Integer;
File
SysUtils

Description
Call AnsiPos to obtain the byte offset of the Substr parameter, as it appears in the string S. For example, if Substr is the string "AB", and S is the string "ABCDE", AnsiPos returns 1. If Substr does not appear in S, AnsiPos returns 0.

Note: This function supports multi-byte character sets (MBCS).
IceExecutioner вне форума Ответить с цитированием
Старый 14.06.2009, 13:17   #8
XazzzI
 
Регистрация: 13.06.2009
Сообщений: 5
Радость Всем спасибо

Сделал все гораздо проще . Строка с сылкой всегда начинается на <td><a href='index2.php...' , я это ищю функцией pos , если возвращает 0 - строку удаляю , иначе обрезаю и восстанавливаю предыдущюю строку в которой число X.XXX . Еще один вопрос : есть ли в дельфи функция аналогичная unescape в javascript ? Нужно раскодировать строку типа eval(unescape('%12%05....'));. Собственно , вся проблема в раскодировке этого с процентами . Если знаете , плз , напишите !
XazzzI вне форума Ответить с цитированием
Старый 14.06.2009, 16:52   #9
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

эээммм... преобразуй строку в массив чычсел.. а потом функцыей CHR из числа в символ.. либо преобразуй строку в массив байт.. и потом функцыей SetString из байтов в строку..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 15.06.2009, 07:47   #10
IIpopoK
Пользователь Подтвердите свой е-майл
 
Аватар для IIpopoK
 
Регистрация: 03.01.2008
Сообщений: 49
Восклицание

Смотри тут:
http://programmersforum.ru/showthread.php?t=53615
IIpopoK вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
текст из файла в Memo malkolm Общие вопросы Delphi 6 12.01.2009 17:02
напечатать текст из Memo Sanek777 Общие вопросы Delphi 1 30.08.2008 21:25
(Memo) на текст D-mon БД в Delphi 4 06.06.2008 11:22
считать текст из memo - посимвольно prizrak1390 Помощь студентам 10 13.12.2007 21:42
В Memo сделать так, чтобы текст был разного цвета, разноцветный memo Artem Компоненты Delphi 3 07.09.2007 13:40