![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Две версии Функции. что выбрать?
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]в реальной жизни твой подход мало применим,
В моей реальной жизни он ежедневно применим.
Что там у автора, я без понятия. Но он сказал, что фсё чотко, все теги парные и т.д.