Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

Люди, помогите сделать ф-ю, вырезки части в строковой переменной   Найти похожие ветки 

 
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

Прямое(однопроходное/не рекурсивное) сканирование

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;
..............
- удалятся только теги без вложений ( "<1 <2>3>"==> "<13>")


 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.023 c
3-65747
Tumcoat
2003-11-03 04:58
2003.11.20
Переход из group или order by в обычный режим не теряя курсора.


3-65728
sasasasa
2003-11-01 23:02
2003.11.20
Interbase API


3-65795
AndSoft
2003-10-30 13:40
2003.11.20
Помогите разобраться с ошибкой


1-65966
Ord3f8h
2003-11-11 02:12
2003.11.20
как открыть файл используя Button


1-65874
sagchat
2003-11-09 13:04
2003.11.20
Как Показать текст между находящийся между символами