![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление подстроки в строке. Выборочное.
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.