| __Cheat3r | 
| Отправлено: 28.01.2006, 18:22 |  | 
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 110
 
 
 
  
 | Доброго времни суток. Помогите написать функцию для очитски строки от HTML-тегов.
 Написать не сложно , но у меня возникают проблемы , изза того , что я не хочу удалять из строк теги
 и
 т.е.
 иммеем:
 
 | CODE |  | AnsiString notCleared ="<font size="2">First<br/><U>SecondStr</U></FONT>"; | 
 
 а нужна такая:
 
 | CODE |  | Cleared = "First<br/>SecondStr"; | 
 
 
 Помогите...
 Огромная спасибо.
 
 Отредактировано __Cheat3r — 28/01/2006, 18:25
 | 
|  | 
| Aptem | 
| Отправлено: 29.01.2006, 10:42 |  | 
|  
 Мастер участка
 
 Группа: Участник
 Сообщений: 349
 
 
 
  
 | Самый простой способ на мой взгляд это использование функций Pos и SubString. Это методы класса AnsiString. Почитайте помощь и все поймете. | 
|  | 
| __Cheat3r | 
| Отправлено: 29.01.2006, 11:25 |  | 
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 110
 
 
 
  
 | Я эти методы насквозь все знаю. С ними и проблемы.. не знаю как просто подойти к этому. | 
|  | 
| AVC | 
| Отправлено: 30.01.2006, 09:28 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 1583
 
 
 
  
 | | QUOTE (__Cheat3r @ 29/01/2006, 10:25) |  | Я эти методы насквозь все знаю. С ними и проблемы.. не знаю как просто подойти к этому. | 
 Ну в первом приближении можно так:
 Находим символ '<', находим символ '>' стоящий после '<'. Все что между ними — тело тэга. Сравниваем тело с br ... Сюда еще нужно добавить анализов разных ситуаций типа одиночный символ < и т.п.
 
 Вариант 2 — в первоночальной строке найти и заменить последовательности br на что-то заведомо не реальное. Удалить тэги (согласно 1-му посту вы это умеете). Заменить "взад" что-то заведомо не реальное на br.
 | 
|  | 
| Grigoriy | 
| Отправлено: 02.02.2006, 03:13 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | Небольшое недоразумение — две одинаковые строчки в первом сообщении, посмотрите сами 
 
 Я приведу пример кода на мною любимом ASSEMBLERе
 
 
 | CODE |  | AnsiString RemoveTagHtmlExcept_br(AnsiString &sourcestrhtml)
 {
 char* s1;
 int es_,ds_,edi_,ecx_,ebx_,L;
 s1=sourcestrhtml.c_str();
 ecx_=sourcestrhtml.Length();
 asm
 {
 mov ebx_,ebx;
 mov es_,es;
 mov ds_,ds;
 mov es,ds_;
 mov esi,s1;
 mov edi,esi;
 mov ecx,ecx_;
 mov ebx,ecx;
 @1:
 mov al,'<';
 @2:
 cmp al,ds:[esi];
 jz @3;
 movsb;
 loop @2;
 jmp @g;
 @3:
 mov edx,ds:[esi];
 or edx,0x00202000;
 cmp edx,'>rb<';
 jz @4;
 mov edx,ds:[esi+1];
 or edx,0x00202000;
 cmp edx,'>rb/';
 jz @4;
 mov edx,ds:[esi+1];
 or edx,0x00002020;
 cmp edx,'>/rb';
 jz @4;
 mov al,'>';
 mov edx,edi;
 mov edi,esi;
 repnz scasb;
 sub esi,edi;
 add ebx,esi;
 mov esi,edi;
 mov edi,edx;
 inc ecx;
 loop @1;
 jmp @g;
 @4:
 movsb;
 loop @2;
 @g:mov es,es_;
 mov L,ebx;
 mov ebx,ebx_;
 };
 sourcestrhtml.SetLength(L);
 return sourcestrhtml;
 };
 | 
 
 Отредактировано Grigoriy — 03/02/2006, 16:52
 | 
|  | 
| __Cheat3r | 
| Отправлено: 02.02.2006, 07:28 |  | 
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 110
 
 
 
  
 | Слушай, я бы тееб за АСМ памятник поставил бы  
 
 Отредактировано __Cheat3r — 02/02/2006, 09:56
 | 
|  | 
| __Cheat3r | 
| Отправлено: 02.02.2006, 09:57 |  | 
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 110
 
 
 
  
 | ЗЫ функция не работает... | 
|  | 
| Grigoriy | 
| Отправлено: 02.02.2006, 13:12 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | | QUOTE (__Cheat3r @ 02/02/2006, 09:57) |  | ЗЫ функция не работает... | 
 Должна работать, если вместо тега
 
 применять правильный
 
 или я что-то не так понял ?
 
 Отредактировано Grigoriy — 02/02/2006, 13:13
 | 
|  | 
| Grigoriy | 
| Отправлено: 02.02.2006, 13:33 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | Да, я находил в кэше "*.htm"- файлы с тегами 
 
 Причем файлов со вторым тэгом было больше, чем с третим, хотя известно, что '/' ставится после '<' в тэгах...
 
 Я отредактировал свой код в сообщении от 02/02/2006, 03:13.
 Добавил все три варианта.
 | 
|  | 
| Guest | 
| Отправлено: 02.02.2006, 16:23 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | | CODE |  | <br> перевод строки
 <br /> встречается в php
 </br> в природе не бывает (br — не "парный" тег и закрывающего не имеет)
 
 | 
 кроме того после левой угловой скобки и перед правой может стоять любое число символов ' ', '\n', '\r', '\t' (хотя обычно так не пишут).
 | 
|  | 
| Grigoriy | 
| Отправлено: 02.02.2006, 19:44 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | Эта строка была в одном из *.htm — файлов в кэше Opera.
 | 
|  | 
| __Cheat3r | 
| Отправлено: 03.02.2006, 07:14 |  | 
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 110
 
 
 
  
 | Функция не работает всё равно... | 
|  | 
| AVC | 
| Отправлено: 03.02.2006, 09:30 |  | 
| 
 Ветеран
 
 Группа: Модератор
 Сообщений: 1583
 
 
 
  
 | | QUOTE (Grigoriy @ 02/02/2006, 18:44) |  | Эта строка была в одном из *.htm — файлов в кэше Opera.
 | 
 
 | QUOTE |  | -а во-вторых, — бог их знает,  чего они туда плеснули. Вы  можете сказать — что им придет в голову?
 М.А. Булгаков — "Собачье сердце"
 
 | 
 Кеш хранит не то что правильно, а то что кто-то где-то написал.
 | 
|  | 
| Grigoriy | 
| Отправлено: 03.02.2006, 14:00 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | | QUOTE (__Cheat3r @ 03/02/2006, 07:14) |  | Функция не работает всё равно... | 
 Приведите пример строки HTML — кода, пожалуйста, когда функция не работает.
 | 
|  | 
| Grigoriy | 
| Отправлено: 03.02.2006, 14:35 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | | QUOTE (__Cheat3r @ 03/02/2006, 07:14) |  | Функция не работает всё равно... | 
 Кажется понял.
 Есть ещё тэги
 
 
 
 По статистике в кэше я нашел
 581 файл с тэгами
 
 
 
 и
 90 файлов с тегами
 
 Это значит, что есть тэги и с символами в верхнем и с символами в нижнем регистре.
 Я снова изменил код своей подпрограммы.
 
 Отредактировано Grigoriy — 03/02/2006, 14:36
 | 
|  | 
| Guest | 
| Отправлено: 03.02.2006, 15:18 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Короче так: вот мой код 
 | CODE |  | String Text="Test<br>Test<hr>Test";
 RemoveTagHtmlExcept_br(Text);
 ShowMessage(Text);
 | 
 
 Сообщение получаеться то же , что и описано .. Действий — никаких...
 Пиши если что на мыло ZetSoft@mail.ru
 | 
|  | 
| __Cheat3r | 
| Отправлено: 03.02.2006, 15:23 |  | 
|  
 Станционный диспетчер
 
 Группа: Участник
 Сообщений: 110
 
 
 
  
 | Хм , исправил код на вот этот — | CODE |  | String Text="Test<br>Test<hr>Test";
 
 Msg(RemoveTagHtmlExcept_br(Text));
 
 | 
 - заработало , но простите , какого , у вас тогда в
 AnsiString RemoveTagHtmlExcept_br(AnsiString &sourcestrhtml)
 Стоит ссылка на строку.. надо так — AnsiString RemoveTagHtmlExcept_br(AnsiString sourcestrhtml)
 
 ЗЫ. Спасибо... напиши на мыло? есть пару вопросов...
 
 Отредактировано __Cheat3r — 03/02/2006, 15:24
 | 
|  | 
| Grigoriy | 
| Отправлено: 03.02.2006, 16:53 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | | QUOTE (__Cheat3r @ 03/02/2006, 15:23) |  | ...... - заработало , но простите , какого , у вас тогда в
 AnsiString RemoveTagHtmlExcept_br(AnsiString &sourcestrhtml)
 Стоит ссылка на строку.. надо так — AnsiString RemoveTagHtmlExcept_br(AnsiString sourcestrhtml)
 ......
 | 
 А какая надобность в передаче по значению ?
 Ведь Формальный и Фактический параметр не изменяется всё равно !
 Лишние операции на копирование объекта AnsiString и используемой им области памяти, где содержится последовательность байтов строки, в другу облясть памяти ?
 
 Да, простите, если не указал, что следует использовать только возвращаемое return значение: ((
 
 Но я ЕЩЁ РАЗ ИЗМЕНИЛ КОД И... он даже стал проще !
 Теперь одинаковый результат возвращает и return и Фактический параметр.
 
 Типа того как это делают стандартные функции языка C++.
 
 
 | QUOTE |  | ЗЫ. Спасибо... напиши на мыло? есть пару вопросов... | 
 
 Напишу, OK.
 
 Отредактировано Grigoriy — 03/02/2006, 16:58
 | 
|  | 
| Grigoriy | 
| Отправлено: 05.02.2006, 04:43 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | | QUOTE (Guest @ 02/02/2006, 16:23) |  | кроме того после левой угловой скобки и перед правой может стоять любое число символов ' ', '\n', '\r', '\t' (хотя обычно так не пишут).
 | 
 Да вы что ?!
 А можно привести хоть небольшой пример html-кода, где после символа '<' встречается что-то вроде
 '\n', '\r', '\t'
 
 ?
 
 
 Это специальные символы языка C++.
 
 
 
 
 А специальные символы html-языка начинаются с символа
 &
 
 | CODE |  | < = <
 > = >
 & = &
 " = "
 
 | 
 А любой символ из таблицы символов ANSI :
 
 код-код символа в таблице ANSI.
 
 Отредактировано Grigoriy — 05/02/2006, 05:27
 | 
|  | 
| Grigoriy | 
| Отправлено: 05.02.2006, 04:59 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 | Айда Плюс-минус
 
 ±
 
 
 Отредактировано Grigoriy — 05/02/2006, 05:02
 | 
|  | 
| Grigoriy | 
| Отправлено: 05.02.2006, 05:19 |  | 
| 
 Мастер участка
 
 Группа: Участник
 Сообщений: 381
 
 
 
  
 |  
 Отредактировано Grigoriy — 05/02/2006, 05:20
 | 
|  | 
| Guest | 
| Отправлено: 06.02.2006, 17:41 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | | QUOTE |  | Да вы что ?!
 А можно привести хоть небольшой пример html-кода, где после символа '<' встречается что-то вроде
 '\n', '\r', '\t'
 
 | 
 Признаю, с левой малость погорячился, ну а для правой вот
 
 | CODE |  | aaaaaaa
 <br
 
 
 
 >
 bbbbbbb
 
 | 
 | 
|  |