Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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

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

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
3-65723
Вася
2003-11-02 12:18
2003.11.20
Сумма


6-66029
I_Sword
2003-09-24 18:29
2003.11.20
MAC адреса компьютеров в локальной сети


1-65855
RoLeX
2003-11-09 19:13
2003.11.20
Чтоб не выводились надписи


3-65796
GIL
2003-10-30 16:27
2003.11.20
Поиск БД


11-65809
asp
2003-03-03 21:40
2003.11.20
Обработка сообщений.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский