C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Очистка строки от тегов, AnsiString
__Cheat3r
Отправлено: 28.01.2006, 18:22


Станционный диспетчер

Группа: Участник
Сообщений: 110



Доброго времни суток.
Помогите написать функцию для очитски строки от HTML-тегов.
Написать не сложно , но у меня возникают проблемы , изза того , что я не хочу удалять из строк теги
CODE
"<br/>"

и
CODE
"<br/>"

т.е.
иммеем:
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



Небольшое недоразумение — две одинаковые строчки в первом сообщении, посмотрите сами
QUOTE

CODE

"<br/>"

и
CODE

"<br/>"



Я приведу пример кода на мною любимом 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



Слушай, я бы тееб за АСМ памятник поставил бы smile.gif


Отредактировано __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)
ЗЫ функция не работает...

Должна работать, если вместо тега
CODE

<br/>

применять правильный
CODE

</br>

или я что-то не так понял ?

Отредактировано Grigoriy — 02/02/2006, 13:13
Grigoriy
Отправлено: 02.02.2006, 13:33


Мастер участка

Группа: Участник
Сообщений: 381



Да, я находил в кэше "*.htm"- файлы с тегами
CODE

<br>
<br/>
</br>


Причем файлов со вторым тэгом было больше, чем с третим, хотя известно, что '/' ставится после '<' в тэгах...

Я отредактировал свой код в сообщении от 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



CODE

<br></br>

Эта строка была в одном из *.htm — файлов в кэше Opera.
__Cheat3r
Отправлено: 03.02.2006, 07:14


Станционный диспетчер

Группа: Участник
Сообщений: 110



Функция не работает всё равно...
AVC
Отправлено: 03.02.2006, 09:30


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Grigoriy @ 02/02/2006, 18:44)
CODE

<br></br>

Эта строка была в одном из *.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)
Функция не работает всё равно...

Кажется понял.
Есть ещё тэги

CODE

<BR>


По статистике в кэше я нашел
581 файл с тэгами

CODE

<br>


и
90 файлов с тегами
CODE

<BR>

Это значит, что есть тэги и с символами в верхнем и с символами в нижнем регистре.
Я снова изменил код своей подпрограммы.

Отредактировано 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

&lt; = <
&gt; = >
&amp; = &
&quot = "

А любой символ из таблицы символов ANSI :
CODE

&#код

код-код символа в таблице 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

Вернуться в Вопросы программирования в C++Builder