
19.02.2013, 22:35
|
|
Цитата:
Сообщение от Bargest
Я бы сделал так.
A = 1.
Ищу первое вхождение < после A.
Копирую 10 символов с этой позиции во временную строку.
Смотрю на нужный тег. Если не нужный - ищу следующую < с этой позиции. Если нужный - копирую от A до текущей позиции, ищу к нему закрывающий и A = концу закрывающего.
Вернуться в начало.
Каждое прибавление символа к строке - это перевыделение памяти под строку.
|
Ну вот:
Код:
function DelUseless(const Data:string):string;
var
Len,J:integer;
DefineTeg:string; (*первые N символов после <*)
starttime,endtime,q:int64;
Count:integer; (*счетчик позиции символа в строке*)
Pos1:integer; (*позиция вхождения < в строке*)
TegEnd:Integer; (*позиция окончания тега*)
Pattern:string; (*выделенный Тег из строки*)
SubStr:string;
begin starttime:=GetTickCount;
Len:=Length(Data);
J:=0;
if Length(Data) = 0 then Exit else
Count:=1;
(*-----------------ЦИКЛ-----------------------------*)
repeat
Pos1:=PosEx('<', Data,Count); (*поиск первого вхождения символа < в строке*)
if Pos1 = 0 then
begin
if Count = 1 then (*эта ветка на тот случай если вообще нет тегов в странице*)
begin
Result:=Data;
Break;
end else
begin (*эта ветка копирует все после того как закончатся <*)
SubStr:=Copy(Data, Count, Len-Count-1);
J:=Length(SubStr)+Length(Result);
Insert(SubStr, Result, J+1);
Break;
end;
end else
begin (*тут конечно можно проще, но на скорость это не влияет*)
DefineTeg:=Copy(Data, Pos1, 10); (*копируем первые 11 символов с позиции первого вхождения*)
TegEnd:=PosEx(' ',DefineTeg,1); (*позиция первого пробела *)
if TegEnd = 0 then (*если пробела нет ищем >*)
TegEnd:=PosEx('>',DefineTeg,1); (*позиция первого >*)
Pattern:=Copy(DefineTeg, 1, (TegEnd-1)); (*выделяем паттерн тега*)
(*----------------------------------------------------------*)
(*далее определяем есть ли в Перем нужный тег(<script)*)
if Pattern = '<script' then
begin
SubStr:=Copy(Data, Count, Pos1-Count); (*копировать от Count до позиции Pos1*)
J:=Length(SubStr)+Length(Result); (*число символов в ВЫХОДЕ!!!!!*)
Insert(SubStr, Result, J+1);
Count:=PosEx('</script>', Data, Pos1)+9; (*переводим позицию на следующий символ*)
end
else
begin
SubStr :=Copy(Data, Count, Pos1-Count+1); (*копировать все gghh<*)
J:=Length(SubStr)+Length(Result);
Insert(SubStr, Result, J+1);
Count:=Pos1+1; (*переводим позицию на следующий символ*)
end;
end
until Pos1 = 0 ;
(*-----------------конец-----------------------------*)
endtime:=GetTickCount; q:=endtime-starttime; ShowMessage('TIME = '+IntToStr(q));
end; (*все работает 50 мС для 3 мБ*)
Но результат практически вдвое хуже чем в варианте с посимвольным копированием в цикле FOR
Если возможно, укажите на узкие участки и как их заменить, но без использования указателей. это пока не совсем понятно
и еще косячок: почемуто пропадают два последние символа в строке, было </html> стало </htm, непонятно куда
|