Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2017.11.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.003 c
2-1450384249
Max
2015-12-17 23:30
2017.11.12
Сделать в stringgrid строки enabled.Афды


2-1449667867
lewka
2015-12-09 16:31
2017.11.12
Очистка Twebbrowser


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


3-1315470203
miau
2011-09-08 12:23
2017.11.12
Блокировка в SQL


2-1450677845
ВладОшин
2015-12-21 09:04
2017.11.12
подскажите обратную формулу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский