Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск текста, между тэгами 
V
    Опции темы
Rondo
Дата 6.7.2006, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Подскажите как можно найти текст в html документе, между какими то тегами.
Тоесть чтоб например в memo выводилось все что лежит между тегами <body>это должно вывестись в momo </body>
 smile  
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Poseidon
Дата 6.7.2006, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Можно smile

Код
function GetTextInHTML(HTML, TegStart, TegFin: string): string;
var p0, p1: integer;
begin
p0:= pos(TegStart, HTML) + Length(TegStart);
p1:= pos(TegFin, HTML);
Result:= copy(HTML, p0, p1-p0);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
HTMLText: string;
begin
HTMLText:= '<body>это должно вывестись в momo </body>';
Memo1.Text:= GetTextInHTML(HTMLText, '<body>', '</body>')
end;


Писал "на коленке", поэтому можно многое оптимизировать. Но главное - суть - должна быть понятна smile 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Rondo
Дата 6.7.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Спасибки за такой быстрый ответ, ща проверю! 
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Rondo
Дата 6.7.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Все работате, только после того как найдет 1 тег останавливается

Добавлено @ 00:00 
Как сделать чтоб он все тэги страницы выводил, немогу придумать smile  
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Poseidon
Дата 7.7.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Rondo @  6.7.2006,  23:54 Найти цитируемый пост)
Как сделать чтоб он все тэги страницы выводил
 Что это значит? На одной странице может быть до сотни различных тегов. Ты хочешь их все выводить? Или ты хочешь выводить все врагменты текста, каторый заключен  к какой-то один тип тега (как <body> в примере)?
 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Rondo
Дата 7.7.2006, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Я имел в виду чтоб он все писал мне в memo что находится между <тег>...</тег> body я простн взял для примера smile
Мне надо все фрагменты текста на страницы которые заключены в нужный мне тег  
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Poseidon
Дата 7.7.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Ну так загони функцию в цикл smile

Что-то вроди такого (опять "на коленке")   smile 

Код

function GetTextInHTML(HTML, TegStart, TegFin: string): string;
var
p0, p1: integer;
stop: boolean;
iHTML: string;
begin
Result:= '';
repeat
p0:= pos(TegStart, HTML) + Length(TegStart);
p1:= pos(TegFin, HTML);
Result:= Result + copy(HTML, p0, p1-p0);
iHTML:= copy(HTML, p1+Length(TegFin), Length(HTML)-(p1+Length(TegFin)));
Stop:= (iHTML = HTML);
HTML:= iHTML;
until stop;
end;
  

Это сообщение отредактировал(а) Poseidon - 7.7.2006, 00:25


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Rondo
Дата 7.7.2006, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Poseidon, респект! 
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Yanis
Дата 7.7.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Помоему регулярные выражения сильно упрощаю жизнь. 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 7.7.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Yanis, если бы я дал пример с TRegExpr, думаю он бы вообще ничего не понял а просто скопировал. А так хоть разберется с основами работы со строками ;) 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Rondo
Дата 10.7.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Опять же в мемо загружаю текст, и хотелось бы чтоб там осталось только:
Хотелось бы найти что находится между определенными тегами... На этот раз только в первом и последнем найденом теге и поместить найденый текст в отдельную строку smile


M
Girder
Название темы должно отражать ее суть!
 

Это сообщение отредактировал(а) Girder - 10.7.2006, 13:25
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Guedda
Дата 10.7.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Допустим, у тебя есть строка: <tag>Превед!</tag>
Чтобы вытащить Превед! Необходимо проделать следующее:
Код

uses
  Masks,...;
function CutText(Str : string) : string;
begin
  if MatchesMask(Str, '<tag>*') then
    Result := copy(Str, 6, (length(Str) - 5) - 6);
end;


Добавлено @ 14:21 
Соответственно, если у тебя тег будет не <tag>, а какой либо другой, там уже будешь варьировать с MatchesMask и с copy (там по символам подберешь...) 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Mechanic
Дата 10.7.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Rondo @  10.7.2006,  12:19 Найти цитируемый пост)
Хотелось бы найти что находится между определенными тегами... 

А чем выделены теги? Если как в html, тогда поможет вот эта функа, что написана специально для разбора html тегов
Код

function GetNextTag(var Src:PChar; const Tag:string): string;
//returns given tag body, moves pointer to the end of tag
var PStart,PEnd: PChar;
begin
    Result := '';
    PStart := AnsiStrPos(Src,PChar('<'+Tag+#0));
    if PStart = nil then
    begin
        Src := StrEnd(Src); Exit;
    end;
    PStart := AnsiStrPos(PStart,PChar('>'+#0))+1; //skip paramesters
    Src := PStart;
    PEnd := AnsiStrPos(Src,PChar('</'+Tag+'>'+#0));
    if PEnd = nil then
    begin
        Src := StrEnd(Src); Exit;
    end;
    Src := PEnd + Length(Tag) + 3; //Tag terminator with brackets
    if PEnd = PStart then exit;
    SetLength(Result,PEnd - PStart);
    StrLCopy(@Result[1],PStart, Length(Result));
end;
 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Sunr1se
Дата 10.7.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 1.5.2006

Репутация: 6
Всего: 13



насколько я понял, надо просто вставить текст, находящийся между определенными тегами, в отдельную строку? Тогда вот первое, что пришло в голову (уж извините за такой нехороший код).
Код

function ReplaceText(Tag, Text: string): string;
var
  i: integer;
  FoundedTag: string;
  Bool, Bool2: boolean;
begin
  for i := 1 to Length(Text) do
    if (Text[i] = '<') and not Bool2 then
    begin
      FoundedTag := '';
      FoundedTag := FoundedTag + Text[i];
      Bool := true;
    end
    else if (Text[i] <> '>') and Bool then
      FoundedTag := FoundedTag + Text[i]
    else if (Text[i] = '>') and Bool then
    begin
      FoundedTag := FoundedTag + Text[i];
      Bool := false;
      if FoundedTag = Tag then
        Bool2 := true;
    end
    else if (Text[i] <> '<') and Bool2 then
      Result := Result + Text[i]
    else if (Text[i] = '<') and Bool2 then
    begin
      if StringReplace(Copy(Text, i, Length(Tag) + 1),  '/', '', [rfReplaceAll]) = Tag then
        Bool2 := false;
    end;
end;
 

Добавлено @ 14:31
Пока код писал, вон сколько народу уже откликнулось smile   
--------------------
IRC-канал Винграда 
PM MAIL ICQ   Вверх
Rondo
Дата 10.7.2006, 15:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Спасибо, ща все проверю smile

Добавлено @ 15:12 
Sunr1se, Неправильно понял, допустим у меня такой код.
Код

    </tr>
    <tr>
        <td class="doc" align="left">2006-07-07 20:02:19</td>
        <td class="doc" style="text-align: right;"> 3 897</td>
        <td class="doc" style="text-align: right;"> 51 212</td>
    </tr>
    <tr>
        <td class="doc" align="left">2006-07-08 17:04:06</td>
        <td class="doc" style="text-align: right;"> 1 796</td>
        <td class="doc" style="text-align: right;"> 802</td>
    </tr>
    <tr>
        <td class="doc" align="left">2006-07-09 17:34:14</td>
        <td class="doc" style="text-align: right;"> 23 917</td>
        <td class="doc" style="text-align: right;"> 530 030</td>
    </tr>
    <tr>
        <td class="doc"><b>Итого:</b></td>
        <td class="doc" style="text-align: right;"><b> 14 156 608</b></td>
        <td class="doc" style="text-align: right;"><b> 210 125 741</b></td>
    </tr>


Мне надо выдернуть из этого кода 14 156 608 и 210 125 741 (они в самом низу smile) и положить каждое это число в отдельную строчку мемо. 
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0927 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.