Показать сообщение отдельно
  #7  
Старый 17.02.2013, 17:21
Pcrepair
 
Сообщения: n/a
По умолчанию

тут все немножко сложнее, сейчас функция уже имеет вид
Код:
function DelUseless(const Data:string):string;
 
const
Teg1 = '<script'; Teg2 = '<style'; Teg3 = '<noscript'; Teg4 = '<applet';
Teg5 = '<object'; Teg6 = '<textarea'; Teg7 = '<audio'; Teg8 = '<button';
Teg9 = '<canvas'; Teg10 = '<comment'; Teg11 = '<datalist'; Teg12 = '<del';
Teg13 = '<meter'; Teg14 = '<noembed'; Teg15 = '<optgroup'; Teg16 = '<output';
Teg17 = '<progress';
 
var
Len,I,EndTeg,Differ,J:integer;
DefineTeg:string; (*первые N символов после <*)
Pos1,Pos2:integer;
Pattern:string;
starttime,endtime,q:int64;
begin                    starttime:=GetTickCount;
Len:=Length(Data);
SetLength(Result, Len);
Differ:=0;
J:=0;
if Length(Data) = 0 then Exit else
for I := 1 to Length(Data) do
(*-----------------ЦИКЛ-----------------------------*)
 begin (*2 Cycle*)
  if Differ > 0 then Dec(Differ)
   else
      if Data[i] <> '<' then
             begin
               Inc(J);
               Result[J]:=Data[i]; (**)
             end
      else
         begin
          DefineTeg:=Copy(Data, I,11); (*копируем 12 символов*)
          Pos1:=PosEx(' ',DefineTeg,1); (*позиция первого пробела *)
          if Pos1 = 0 then (*если пробела нет ищем >*)
          Pos1:=PosEx('>',DefineTeg,1); (*позиция первого >*)
          Pos2:=Pos1-1;
          Pattern:=Copy(DefineTeg, 1, Pos2); (*выделяем паттерн тега*)
          (*----выбор тега на CASE------------------------*)
            case  AnsiIndexStr(Pattern,
            [Teg1, Teg2, Teg3, Teg4, Teg5, Teg6, Teg7, Teg8, Teg9,
            Teg10, Teg11, Teg12, Teg13, Teg14, Teg15, Teg16, Teg17]) of
              0:begin
                 EndTeg:=PosEx('</script>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 8);
                end;
              1:begin
                 EndTeg:=PosEx('</style>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 7);
                end;
              2:begin
                 EndTeg:=PosEx('</noscript>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              3:begin
                 EndTeg:=PosEx('</applet>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              4:begin
                 EndTeg:=PosEx('</object>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              5:begin
                 EndTeg:=PosEx('</textarea>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              6:begin
                 EndTeg:=PosEx('</audio>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              7:begin
                 EndTeg:=PosEx('</button>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              8:begin
                 EndTeg:=PosEx('</canvas>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              9:begin
                 EndTeg:=PosEx('</comment>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              10:begin
                 EndTeg:=PosEx('</datalist>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              11:begin
                 EndTeg:=PosEx('</del>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              12:begin
                 EndTeg:=PosEx('</meter>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              13:begin
                 EndTeg:=PosEx('</noembed>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              14:begin
                 EndTeg:=PosEx('</optgroup>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              15:begin
                 EndTeg:=PosEx('</output>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
              16:begin
                 EndTeg:=PosEx('</progress>',Data,I);
                 if (EndTeg > 0) then Differ:=(EndTeg - I + 10);
                end;
            else
              begin
                Inc(J);
                Result[J]:=Data[i];
              end;
          (*------конец CASE------------------------------*)
            end;
         end;
 end;
 (*-------конец Цикла-------------------------------------*)
SetLength(Result, J);
endtime:=GetTickCount; q:=endtime-starttime;  ShowMessage('TIME = '+IntToStr(q));
end;  (*78(три тега) полная набор тегов 218 мС для 3 мб текста*)
и удаляет не один тег, а все 17 парных тегов, ненужных для передачи информации

вот как тут ускорить обработку? может кто подскажет?
Ответить с цитированием