__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
| |
|