Текущий архив: 2006.12.31;
Скачать: CL | DM;
ВнизУдаление подстроки в строке. Выборочное. Найти похожие ветки
← →
Strori (2006-12-09 14:45) [0]Привет всем.
Нужно удалить лишние вещи из 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> и т.д. нужно оставить на своих местах. Вот тут я застрял. Не подскажете в каком направлениее двигаться?
← →
Джо © (2006-12-09 14:49) [1]> Не подскажете в каком направлениее двигаться?
В направлении т.н. «конечных автоматов», например. А собственно удалением и поиском будут заниматься все теже функции Pos and Copy/Delete.
← →
Strori (2006-12-09 15:10) [2]А подробнее? Чего это такое?
← →
Джо © (2006-12-09 15:12) [3]> [2] Strori (09.12.06 15:10)
> А подробнее? Чего это такое?
yandex.ru «конечные автоматы». Очень много ссылок будет. Описать принцип «в двух словах» не берусь.
← →
Strori (2006-12-09 15:41) [4]Нехило... А попроще никак нельзя?
← →
Anatoly Podgoretsky © (2006-12-09 16:08) [5]> Strori (09.12.2006 15:41:04) [4]
У тебя код странный, зачем то какое то множественное удаление, аж 4 раза подряд
А что значит попроще, растолкуй данный термин.
← →
Strori (2006-12-10 03:44) [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. Из-за чего происходит смещение на число удаленных символов в первом цикле. Ну дальше больше и бредятина полная в итоге. Вот я и думал, что может кто подскажет как справиться с этим смещением... Или есть иные варианты на той же основе. Без применения наворотов.
А про удаление вы правы, достаточно будет одной строки. Поправлю.
← →
Virgo_Style © (2006-12-10 09:28) [7]Если не хочется разбираться, то можно заняться извратом -
StringReplace <p> на, к примеру, [p], потом удалить все, что в угловых скобках, потом заменить обратно.
Это изврат, конечно, но более-менее работоспособный (если в исходном тексте нет включений [p]).
Кстати, цикл for тебе, afaik, не подойдет в силу того, что у тебя в теле цикла изменяется Length(...Text), а цикл for будет использовать его начальное значение.
← →
Strori (2006-12-10 11:20) [8]А как быть тогда?
← →
Loginov Dmitry © (2006-12-10 11:49) [9]Есть код, удаляющий вообще все, что находится между символами <>
То есть он удалит к примеру из тэга <img scr="image.png"> весь текст
а угловые скобки <> оставит? Так что-ли?
← →
Anatoly Podgoretsky © (2006-12-10 11:50) [10]> Loginov Dmitry (10.12.2006 11:49:09) [9]
Он так и делал, сначала удалял внутри, потом левую скобку, потом правую
← →
Strori (2006-12-10 14:02) [11]Короче, не работает. :)
Ладно, будем искать... Спасибо всем.
Страницы: 1 вся ветка
Текущий архив: 2006.12.31;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.039 c