Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление подстроки в строке. Выборочное.


Strori ©   (2006-12-09 14:45:00) 

Привет всем.
Нужно удалить лишние вещи из html файла (не нужные теги). Есть код, удаляющий вообще все, что находится между символами <>
var str, str1, str2, teg: string;

procedure EditView;
var n, m, s, i, q: integer;
begin
 str:=Form1.Memo1.Lines.Text;
  for i := 1 to Length(Form1.Memo1.Text) do
   if Form1.Memo1.Text[i] = '<' then
    begin
     str1:='<';
     n:=pos(str1, str);
     str2:='>';
     m:=pos(str2, str);

     s:=(m-n)-1;
     delete(str, n+1, s);
     delete(str, n+1, 1);
     delete(str, n, 1);
   end;
Form1.Memo1.Lines.Text:=str;
   end;

Код работает. Но удалять нужно не все. Допустим теги , <p></p> и т.д. нужно оставить на своих местах. Вот тут я застрял. Не подскажете в каком направлениее двигаться?


Strori   (2006-12-10 14:02:00) [1]

Короче, не работает. :)
Ладно, будем искать... Спасибо всем.


Anatoly Podgoretsky   (2006-12-10 11:50:00) [2]

> Loginov Dmitry  (10.12.2006 11:49:09)  [9]

Он так и делал, сначала удалял внутри, потом левую скобку, потом правую


Loginov Dmitry   (2006-12-10 11:49:00) [3]

Есть код, удаляющий вообще все, что находится между символами <>

То есть он удалит к примеру из тэга <img scr="image.png"> весь текст
а угловые скобки <> оставит? Так что-ли?


Strori   (2006-12-10 11:20:00) [4]

А как быть тогда?


Virgo_Style   (2006-12-10 09:28:00) [5]

Если не хочется разбираться, то можно заняться извратом -
StringReplace <p> на, к примеру, [p], потом удалить все, что в угловых скобках, потом заменить обратно.
Это изврат, конечно, но более-менее работоспособный (если в исходном тексте нет включений [p]).

Кстати, цикл for тебе, afaik, не подойдет в силу того, что у тебя в теле цикла изменяется Length(...Text), а цикл for будет использовать его начальное значение.


Strori   (2006-12-10 03:44:00) [6]

Попроще я думал примерно так: по тому же принципу что в коде,  определяется переменная teg равная содержимому между n и m - то есть собственно тег. И если эта переменная равна скажем <p> то цикл прерывается и начинается с нового i - то есть со следующего значения "<". Но такой вариант не работает. Насколько я понял, потому что Length(Form1.Memo1.Text) величина постоянная, определяемая один раз перед началом цикла. А вот переменная str:=Form1.Memo1.Lines.Text;, от которой происходит определение номера символов n и m - она в конце каждого цикла обновляется. Почему - я не знаю... И получается, что i принимается по первоначальному числу символов в Memo1.Text, а номера символов n и m принимаются уже по обновленному значению Form1.Memo1.Lines.Text. Из-за чего происходит смещение на число удаленных символов в первом цикле. Ну дальше больше и бредятина полная в итоге. Вот я и думал, что может кто подскажет как справиться с этим смещением... Или есть иные варианты на той же основе. Без применения наворотов.

А про удаление вы правы, достаточно будет одной строки. Поправлю.


Anatoly Podgoretsky   (2006-12-09 16:08:00) [7]

> Strori  (09.12.2006 15:41:04)  [4]

У тебя код странный, зачем то какое то множественное удаление, аж 4 раза подряд

А что значит попроще, растолкуй данный термин.


Strori   (2006-12-09 15:41:00) [8]

Нехило... А попроще никак нельзя?


Джо   (2006-12-09 15:12:00) [9]

> [2] Strori   (09.12.06 15:10)
> А подробнее? Чего это такое?

yandex.ru «конечные автоматы». Очень много ссылок будет. Описать принцип «в двух словах» не берусь.


Strori   (2006-12-09 15:10:00) [10]

А подробнее? Чего это такое?


Джо   (2006-12-09 14:49:00) [11]

> Не подскажете в каком направлениее двигаться?

В направлении т.н. «конечных автоматов», например. А собственно удалением и поиском будут заниматься все теже функции Pos and Copy/Delete.


Наверх

Титульная страница Поиск, карта сайта Написать письмо