Показать сообщение отдельно
  #13  
Старый 19.02.2013, 22:35
Pcrepair
 
Сообщения: n/a
По умолчанию

Цитата:
Сообщение от 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, непонятно куда
Ответить с цитированием