Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Две версии Функции. что выбрать?


Страницы:   1 2 3 4

Pcrepair ©   (2012-12-06 23:33:00) 

Добрый день. Есть два варианта функции (удаляет теги и текст между тегами)

Вариант1

function DelJS(const Code:string):string;
var
Buffer:string;
StartTeg:integer;
EndTeg:integer;
i:integer;
begin
Buffer:=Code;
  repeat
    try
        StartTeg:=Pos('<script', Buffer);
        EndTeg:=Pos('</script>', Buffer);
        Delete(Buffer, StartTeg, EndTeg-StartTeg+9);
        i:=Pos('<script', Buffer);
    except
      break
    end;
    until  i = 0;
  Result:=Buffer;
end;


Вариант2

function DelJS(const Code:string):string;
var
EndTeg:string;
Buffer:string;
index1:integer;
index2:integer;
i:integer;
begin
EndTeg:='</script>';
Buffer:=Code;
 index1:=Pos('<script', Buffer);
   while (index1 <> 0) do
     begin
       index2 := index1;
       i := 1;
         while i <> 10 do
          begin
           try
            Inc(index2);
             if Buffer[index2] = EndTeg[i] then
              Inc(i)
            else
              i := 1;
            except
              break
            end;
          end;
        Delete(Buffer, index1, index2 - index1 + 1);
      index1 := Pos('<script', Buffer);
    end;
 Result := Buffer;
end;


Оба варианта работают в общем одинаково, удаляют что назначено, грузят проц на большом файле и все такое

ВНИМАНИЕ!!! Вопросы:
1. какой вариант более соотвествует классическому стилю программирования, более правильный?
2. может есть недостатки? кто знает, напишите, пожалуйста


DVM   (2012-12-08 15:32:00) [41]


> Медвежонок Пятачок ©   (08.12.12 11:23) [39]


> мегафункции грузящие процессор......

а COM объект-монстр, тянущий за собой библиотек на добрую сотню мегабайт, строящий DOM модель (и соответственно по черному жрущий память) для тривиальной задачи - это нормально? И не дай бог для задачи, где требуется высокая производительность? Его функция из [25] много быстрее будет, сдается мне, и к памяти нетребовательна.


Медвежонок Пятачок   (2012-12-08 11:23:00) [42]

Не, если человек велорикша, то это надолго.
инди, регэксп, мегафункции грузящие процессор......

begin
xdoc := CoDomDocumnent.create();
xdoc.async := false;
xdoc.load(' http://mypageurl');

xml_enum_nodes(xdoc,'//script',delete_callback_function);
xml_enum_nodes(xdoc,'//*/@onClick',setnull_callback_function);
xml_enum_nodes(xdoc,'//*/@onClick',setnull_callback_function);
end;

function delete_callback_function(iNode,.....) : boolean;
begin
iNode.parentNode.removeChild(iNode);
return true;
end;

function setnull_callback_function(iNode,.....) : boolean;
begin
iNode.nodeValue := '';
result := true;
end;

function xml_enum_nodes(iNode,aXPath, aCallback) : integer;
begin
Result := 0;
iList := iNode.selectNodes(aXPath);
for i := (iLIst.length) down to 0 do
 if aCallback(iList.item[i]) then inc(Result);
end;


sniknik   (2012-12-08 10:12:00) [43]

> sniknik, спасибо за развернутый ответ
но следовать ему я не буду ибо см "отмазки" по пунктам...
?
я прочитал именно это. нафига спрашиваешь тогда? если все устраивает, зачем нас "уговаривать" что это нормально, и у тебя такого не будет... вместо того чтобы принять к сведению не предусмотренные тобой варианты.
нафига после ответа меняешь условия? - "у меня того не будет, другого тоже не будет". почему это в задаче не описано???

по пункту 2. открой прямо вот эту страницу в исходном коде и вырежи ну хотя бы первые 3 блока тегов по своему "алгоритму".


кунак   (2012-12-08 02:28:00) [44]

http://tsya.ru
и:
1. ждать на входе "<script", символы слать на выход
2. дождавшись блокировать выход, ждать "/script>"
3. сполоснуть и повторить


Германн   (2012-12-08 02:13:00) [45]


> хватит уже отклонятся от темы
>

А тема то какая?
Тот самый супер-пупер-мега-проект?


Pcrepair   (2012-12-08 01:18:00) [46]

использование РегЕксп от ХЕ3 уменьшит загрузку проца?
по поводу РегЕксп от ХЕ3 кто что знает?
хватит уже отклонятся от темы


DVM   (2012-12-08 01:05:00) [47]

не с pre я перепутал, возьмем такой вариант лучше

<PLAINTEXT><script>...</script></PLAINTEXT>

тут точно <script> никакого отношения к JS не имеет и его удалять не надо


DVM   (2012-12-08 01:00:00) [48]


> знайка   (08.12.12 00:56) [32]


> с чего вдруг?

содержимое тега PRE разве не должно выводиться в точности как написано


знайка   (2012-12-08 00:56:00) [49]


> но так неправильно
с чего вдруг?


DVM   (2012-12-08 00:53:00) [50]


> Pcrepair ©   (08.12.12 00:47) [30]
> для меня ПРАВИЛЬНО

тогда чего ты хочешь? функцию ты уже написал, если она работает так и оставь, я бы только не стал надеяться, что

>  EndJS   = '</script>';

закрывающая скобка > всегда будет вплотную. ну и регистр еще.


Pcrepair   (2012-12-08 00:47:00) [51]

для меня ПРАВИЛЬНО, если какие то потсы непонятно для чего засунут в тег PRE зачемто текст с символами script и прочее это их личные проблемы
еще разок:
- есть загрузчик на idHTTP.GET
- при загрузке страниц с фреймами нужно просто удалить теги скриптов со всем содержимым(там есть теги frame src) чтоб не сбивать работу кода дозакачивающего страницы фреймов


DVM   (2012-12-08 00:39:00) [52]


> Pcrepair ©   (08.12.12 00:36) [27]
> а вот это самое:
>
> <PRE></PRE>
>
> как и положено

но так неправильно, внутри PRE CODE PLAINTEXT находится не JavaScript а просто текст.


Pcrepair   (2012-12-08 00:37:00) [53]

по поводу РегЕксп от ХЕ3 кто что знает?


Pcrepair   (2012-12-08 00:36:00) [54]

а вот это самое:

<PRE></PRE>

как и положено


DVM   (2012-12-08 00:34:00) [55]


> Pcrepair ©   (08.12.12 00:22) [25]
> как много.... нафантазировано
> все проще:

Что будет делать твой код, встретив такое:

<PRE><script>...</script></PRE>


Pcrepair   (2012-12-08 00:22:00) [56]

как много.... нафантазировано
все проще:
- есть загрузчик на idHTTP.GET
- при загрузке страниц с фреймами нужно просто удалить теги скриптов со всем содержимым(там есть теги frame src) чтоб не сбивать работу кода дозакачивающего страницы фреймов

желательно еще чтоб на жирных страницах проц не грузило
и тут еще вопрос:
использование РегЕксп от ХЕ3 уменьшит загрузку проца в сравнении с

function DelJS(const Code:string):string;
const
 StartJS = '<script';
 EndJS   = '</script>';
var
 iCopyFrom,iCopyUp,iRes,Len:integer;
begin
 Len:=Length(Code);
 SetLength(Result,Len); //выделяем память под строку без копирования
 if Len = 0 then Exit;
 iRes:=1;
 iCopyFrom:=1; //индекс начала копируемого куска текста
 repeat
   iCopyUp:=PosEx(StartJS,Code,iCopyFrom); //индекс конца копируемого куска + 1
   if iCopyUp = 0 then iCopyUp:=Len+1; //если тег не найден, то копируем до конца строки
   Move(Code[iCopyFrom],Result[iRes],(iCopyUp-iCopyFrom)*SizeOf(Code[1])); //копируем кусок в Result
   inc(iRes,iCopyUp-iCopyFrom);
   iCopyFrom:=PosEx(EndJS,Code,iCopyUp+Length(StartJS)); //ищем заверш.тег
   if iCopyFrom = 0 then //нештатная ситуация - пропуск тега
     break
   else
     inc(iCopyFrom,Length(EndJS)); //индекс начала следующего куска текста
 until iCopyFrom > Len;
 if Length(Result) > iRes-1 then //корректируем длину рез.строки
   SetLength(Result,iRes-1);
end;

ась??


Медвежонок Пятачок   (2012-12-08 00:07:00) [57]

В смысле не поломается ли документ после save?
Не поломается.
Останутся даже исходные CRLF если исходник был с ними.

/* некоторые (не я) любят чтобы и в блокноте xml был лесенкой */


DVM   (2012-12-08 00:01:00) [58]


> Медвежонок Пятачок ©   (07.12.12 23:35) [21]

А вот еще момент такой. Если автор хочет удалить из страницы теги с JavaScript, то вероятно он потом хочет получить на выходе код максимально близкий к тому, что было, но без тегов. Обратное преобразование DOM в текст не исказит ли как страницу?


Sha   (2012-12-07 23:51:00) [59]


> Pcrepair ©   (07.12.12 20:22) [10]
> 4. вот по поводу не самых скоростных функций если можно подробнее.
> что там еще в делфи кроме встроенных процедур и функций может быть еще?


Ты не поверишь - циклы.

Посчитай, сколько раз оба решения проверят первый символ и переместят последний?
А ведь достаточно одного раза. Согласен?


Медвежонок Пятачок   (2012-12-07 23:35:00) [60]

в реальной жизни твой подход мало применим,

В моей реальной жизни он ежедневно применим.
Что там у автора, я без понятия. Но он сказал, что фсё чотко, все теги парные и т.д.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо