Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
ВнизЛюди, помогите сделать ф-ю, вырезки части в строковой переменной Найти похожие ветки
← →
A natoly (2003-11-11 13:00) [0]или найти, задача, вырезать все html теги (...) в переменной. Заранее благодарен.
← →
Skier (2003-11-11 13:01) [1]Pos(...)
Delete(...)
StringReplace(...)
← →
Anatoly Podgoretsky (2003-11-11 13:02) [2]Для вырезки части в строковой переменной существует процедура DELETE уже свыше 10 лет
← →
A natoly (2003-11-11 14:07) [3]Млин, не могу совладать с функцией, помогите.
function Ttf.del_simvol(s: string): string;
var
i,a,b:integer;
begin
if pos(s,"<")<>0 then
begin
a:=Pos(s,"<");
b:=Pos(s,">");
Delete(s,a,b-a);
end;
Result:=s;
end;
← →
Ave (2003-11-11 14:08) [4]Пользоваться нужно действительно функциями Pos, Delete, Copy. Однако не один раз сталкивался с проблемой длинных строк (несколько сотен-тысяч килобайт), когда вырезка или изменение тэгов (парсинг строки) идет дольше, чем весь остальной код. Посему логичным решением было бы кэшировать строки, единожды написав класс.
← →
A natoly (2003-11-11 14:12) [5]Ааааааа, мне не до кеширования, перебрать бы переменную в цикле, да повырезать все теги.
Заранее благодарен за помощь.
То что я выше написал, это не в цикле, и помоему не правильно начинаю :(
← →
Ave (2003-11-11 14:13) [6]2Anatoly, а что и ним не так?
Если функция должна вырезать все тэги, то код нужно пускать в цикле.
while Pos(s, "<") <> 0 do
begin
a := Pos(s, "<");
b := Pos(s, ">");
Delete(s, a, b - a);
end;
ps. Плюс ко всему нужно отслеживать ситуации, когда b < a. Иначе могут быть проблемы.
← →
A natoly (2003-11-11 14:17) [7]да она почему то ни одного символа не убирает, а по идее все правильно...
← →
Reindeer Moss Eater (2003-11-11 14:19) [8]while Pos("<",s) <> 0 do ...
← →
willys (2003-11-11 14:21) [9]Pos(SubString, String).
т.е. Pos("<", s) и Pos(">", s);
и по-моему Delete(s, a, b - a + 1) надо бы.
← →
A natoly (2003-11-11 14:27) [10]Точно, Pos действительно не правильно, сейчас опять ф-я бесконечная, программа не отвечает :(
function Ttf.del_simvol(s: string): string;
var
i,a,b:integer;
begin
while Pos("<",s) <> 0 and Pos(">", s) do
begin
a := Pos(s, "<");
b := Pos(s, ">");
Delete(s, a, b - a);
end;
Result:=s;
end;
← →
willys (2003-11-11 14:28) [11]ну хорошо, в условии ты поменял. а в вычислении a и b?!
← →
han_malign (2003-11-11 14:44) [12]while Pos("<",s) <> 0 and Pos(">", s) do
begin
a := Pos(s, "<");
b := Pos(s, ">");
Delete(s, a, b - a);
end;
- во первых, расставим скобки порядка вычисления условия цикла
while Pos("<",s) <> (0 and Pos(">", s)) do
- во вторых Delete(s, a, b - a +1);
- в третих
a := Pos( {s,} "<" ,s);
b := Pos( {s,} ">" ,s);
- в четвертых
возьмем исходный текст" > вечный цикл <"
- и прикинем как это будет работать
З.Ы. Большая часть замечаний, уже была высказана раньше другими...
← →
A natoly (2003-11-11 14:46) [13]Что в вычислениях? Удаляем с "а" до "b", все верно вроде :(
← →
A natoly (2003-11-11 14:49) [14]Ух ты, han_malign, спасибо преогромнейшее, s в фигурных скобках это что новое, как прямо в перле :)
Классно, спасибо ещё раз!!!
← →
willys (2003-11-11 14:53) [15]мда уж... короче, чтобы не мучаться... пиши так:
while (Pos("<",s) <> 0) and (Pos(">", s) <> 0) do
begin
a := Pos("<", s);
b := Pos(">", s);
Delete(s, a, b - a + 1);
end;
а то, мне кажется, обсуждение затянется...
зы. "s в фигурных скобках" - это мощно. надо запомнить.
← →
Fly (2003-11-11 15:09) [16]http://anso.virtualave.net/index_rus.htm - регулярные выражения - отличнейшая вещь!!!
← →
han_malign (2003-11-11 15:27) [17]> мда уж... короче, чтобы не мучаться... пиши так:
> while (Pos("<",s) <> 0) and (Pos(">", s) <> 0) do
- а по другому и не получится
> A natoly (11.11.03 14:49) [14]
> s в фигурных скобках
- это "тег" коментария...
"> вечный цикл <"
==>
Delete(s, 15, 1 - 15);
Delete(s, 15, -14) ==> (-14 > 0)=false ==> ничего не делается
при этом ((Pos("<",s) <> 0) and (Pos(">", s) <> 0))- по прежнему true
Прямое(однопроходное/не рекурсивное) сканирование
- удалятся только теги без вложений ( "<1 <2>3>"==> "<13>")
var
OpenTagPos, CurPos: integer;
begin
CurPos:=1;OpenTagPos:=0;
while(CurPos<=Length(s))do begin
if(s[CurPos]="<")then begin
OpenTagPos:=CurPos;
inc(CurPos);
else begin
if((s[CurPos]=">")and(OpenTagPos>0))then begin
Delete(s,OpenTag,CurPos-OpenTag+1);
CurPos:=OpenTagPos;
OpenTagPos:=0;
end else inc(CurPos);
end;
end;
..............
← →
Fay (2003-11-11 16:09) [18]Ку?
function del_simvol(s : string) : string;
var
p, p1 : PChar;
i, L, n : Integer;
begin
if s = "" then
begin
Result := "";
Exit;
end;
n := 0;
L := Length(s);
GetMem(p, L + 1);
p1 := p;
for i := 1 to L do
case s[i] of
"<" : Inc(n);
">" : Dec(n);
else if n = 0 then
begin
p1^ := s[i];
Inc(p1);
end;
end;
p1^ := #0;
Result := p;
FreeMem(p);
end;
← →
VAleksey (2003-11-11 17:07) [19]Ничего умного в голову не приходит :-)).
← →
Romkin (2003-11-11 17:47) [20]Ну если считать, что вложенных тегов вроде нет...
type
TaState = (asText, asTeg);
function RemoveTags(const txt: string): string;
var
len, newLen: integer;
aState: TaState;
begin
len := length(txt);
setLength(Result, len);
aState := asText;
NewLen := 0;
for i := 1 to len do
case aState of
asText: begin
if txt[i] = "<" then
begin
aState := asTag;
continue;
end;
inc(NewLen);
Result[NewLen] := txt[i];
end;
asTag: if txt[i] = ">" then aState := asText;
end; //case
setLength(Result, NewLen);
end;
Вроде должно работать :)))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c