Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.11.12;
Скачать: CL | DM;

Вниз

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

 
Pcrepair ©   (2012-12-06 23:33) [0]

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

Вариант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. может есть недостатки? кто знает, напишите, пожалуйста


 
Eraser ©   (2012-12-07 00:01) [1]

Я бы прикрутил модуль регулярных выражений. В будущем можно будет легко модифицировать и код будет более понятен.


 
Sha ©   (2012-12-07 00:06) [2]

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


 
Pcrepair ©   (2012-12-07 00:08) [3]


> Никакой. Вот представь, что вручную все сам удалял бы.
> Неужели пользовался бы одним из этих алгортмов?

не слишком ли голословно? что конкретно не так?


 
Sha ©   (2012-12-07 00:13) [4]

> не слишком ли голословно? что конкретно не так?

а ты попробуй нормальными словами проговорить
и выполнить руками каждый шаг - сразу все сам и поймешь


 
RWolf ©   (2012-12-07 00:23) [5]

http://stackoverflow.com/a/1732454


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

. какой вариант более соотвествует классическому стилю программирования,

А какой стиль программирования принимается за классический конкретным программистом?


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

А конкретно по теме - забить философские размышления о классическом стиле. Задуматься над тем, что, что обе функции неизбежно придется модифицировать со временем.
Поэтому надо написать один раз функцию-движок и создать для нее метаданные с описанием что менять и на что.


 
sniknik ©   (2012-12-07 09:53) [8]

по сути обе функции одинаковы, просто вариации на тему циклов, без изменения сути.
недостатки
1 - пустой эксепт. про что говорить уже настолько надоело... больше только страдать от компаний поставляющих такой код на поддержку, ламерами писанный (хорошо еще если есть код, а вот когда программа просто не работает, а ошибка типа у нас... - "- ошибка "не достоверные данные" говорит о глюке в программе их постановляющим. проверите, что от нее приходит. - нет там глюков нет! она работает, и без ошибок. это ваша отказывается! - дайте ей корректные данные, работает? можете тестовые подложить. - да работает. но глюка в программе все одно нет! что делать? ... т.д." и такая бодяга иногда месяцами!!!).
2 - html не регистрозависим. отсюда попросту явный баг в не разборе некоторых страниц.
3 - связанное с первым написание может быть различным не только в регистре буков... это скрипт, могут быть вложенности... ну, например
 <script language="JavaScript" type="text/javascript">
 /*<![CDATA[*/
 function start()
 {
   alert("</script>");
 }
 /*]]>*/
 </script>

4 - не ошибка, но тем не менее, постоянные перераспределения памяти, от изменения текста. не самые скоростные функции в общем.


 
Бодрый Яр   (2012-12-07 11:35) [9]


> модуль регулярных выражений. В будущем можно будет легко
> модифицировать

угу, и получится синтаксический анализатор на регулярныз выражениях

оба варианта неряшливы до крайности


 
Pcrepair ©   (2012-12-07 20:22) [10]

Eraser, если возможно дай ссылку на описание работы с РегЕксп (как там конкретно писать обработку)
Вообще пользуюсь РАД ХЕ3, там есть встроенная обработка РегЕксп, надеюсь программирование обработки у чумбаркадеро совпадает с regexpstudio.com тогда и искать не надо

sniknik, спасибо за развернутый ответ

1. пустой ексепт - не просто так. встречаются страницы, из обработки которых лучше просто выйти. и не важно какая там ошибка
2. ??? непонятно о чем. но вообще после закачки страницы все символы приводятся к нижнему регистру через АнсиЛоерКэйс
3. ну вообщето речь идет об обработке кода в стандарте ХТМЛ, где на открывающий тег всегда есть закрывающий
4. вот по поводу не самых скоростных функций если можно подробнее. что там еще в делфи кроме встроенных процедур и функций может быть еще?


 
DVM ©   (2012-12-07 22:28) [11]


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

НИКАКОЙ.

Для таких задач либо машину состояний надо делать, либо регулярные выражения (собственно это уже готовая ее реализация в каком то смысле)


 
Медвежонок Пятачок ©   (2012-12-07 22:31) [12]

3. ну вообщето речь идет об обработке кода в стандарте ХТМЛ, где на открывающий тег всегда есть закрывающий

И какая цель преследуется?
Что у нас будет после удаления тегов?


 
Медвежонок Пятачок ©   (2012-12-07 22:48) [13]

Хотя какая разница?
Нафик функции, нафик регулярки.
Раз это xhtml, то грузим его в дом.

iList := xdoc.selectNodes("//script");
for i := pred(iList.length) downto 0 do iList.item[i].parentNode.removeChild(iList.item[i]);

xdoc.save(newname);

ShowMessage("зетс олл, фолкс! Все узлы "скрипт" удалены");


 
DVM ©   (2012-12-07 22:58) [14]


> Медвежонок Пятачок ©   (07.12.12 22:48) [13]

узлы то <script> удалены, но сам JavaScript нет, есть же еще такие варианты:


<input type="submit" name="add2" class="add_btn" value="Добавить" title="Добавить вопрос в конференцию" onClick="setCookie("delphi_name", document.F1.name.value);setCookie("delphi_email", document.F1.email.value);" />  


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

С чего бы самому скрипту-то там остаться если он внутри узла <script>?


 
Медвежонок Пятачок ©   (2012-12-07 23:03) [16]

<input type="submit" name="add2" class="add_btn" value="Добавить" title="Добавить вопрос в конференцию" onClick="setCookie("delphi_name", document.F1.name.value);setCookie("delphi_email", document.F1.email.value);" />  

сначала
selectNodes("//*/@onClick");
затем грохнуть весь список.
в общем аналогично.


 
DVM ©   (2012-12-07 23:15) [17]


> сначала
> selectNodes("//*/@onClick");

тогда уж по всем событиям надо

Проще в браузере запретить JS чем выковырять его полностью из страницы, еще CSS анализировать придется, там как ни странно тоже JS возможен.


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

тогда уж по всем событиям надо

selectNodes("//*/@onClick"); // это как раз все события onClick. Вообще все.

Ну так я и говорил, что надо написать енумератор узлов и метаданные для него.

что-то типа такого:
метаданные:
<root>
<item xpath="//script" type="remove"/>
<item xpath="//*/@onClick" type="setNull"/>
....
<item xpath="//*/@onLoad" type="setNull"/>
</root>

енумератор:

selectNodes("/root/item");
цикл по списку;
если тайп = ремув, вызвать функцию удаления узла;
если тайп = setNull вызвать функцию присваивающую узлу пустоту (хотя можно и тоже просто ремувнуть)
конец цикла;


 
Медвежонок Пятачок ©   (2012-12-07 23:24) [19]

Главное что при этом велорикша не участвует.

/* В смысле нет велосипедно-индусского кода. */


 
DVM ©   (2012-12-07 23:31) [20]


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


> это как раз все события onClick. Вообще все.

есть еще другие виды событий я хотел сказать


> Главное что при этом велорикша не участвует.

в реальной жизни твой подход мало применим, так как даже страницы, заявленные как xhtml часто содержат ошибки с точки зрения xhtml но проглатываются браузером, т.к. сервер указывает Content-Type почти всегда text/html и ошибки остаются скрыты. Парсер ведь откажется работать?


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

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

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


 
Sha ©   (2012-12-07 23:51) [22]


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


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

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


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


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

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


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

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

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


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

как много.... нафантазировано
все проще:
- есть загрузчик на 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;

ась??


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


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

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

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


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

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

<PRE></PRE>

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


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

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


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


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

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


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

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


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


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

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

>  EndJS   = "</script>";

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


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


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


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


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


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

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


 
DVM ©   (2012-12-08 01:05) [34]

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

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

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


 
Pcrepair ©   (2012-12-08 01:18) [35]

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


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


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

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


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

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


 
sniknik ©   (2012-12-08 10:12) [38]

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

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


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

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

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;


 
DVM ©   (2012-12-08 15:32) [40]


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


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

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



Страницы: 1 2 вся ветка

Текущий архив: 2017.11.12;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.008 c
2-1450085380
gedevan
2015-12-14 12:29
2017.11.12
Как экспортировать или импортировать таблицу из базы Access


2-1450384249
Max
2015-12-17 23:30
2017.11.12
Сделать в stringgrid строки enabled.Афды


15-1465507801
Юрий
2016-06-10 00:30
2017.11.12
С днем рождения ! 10 июня 2016 пятница


15-1464643802
Юрий
2016-05-31 00:30
2017.11.12
С днем рождения ! 31 мая 2016 вторник


6-1273560246
YurikGL
2010-05-11 10:44
2017.11.12
Модуль Whois, определение города и оператора связи по ip-ку.