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-07 23:31:00) [61]


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


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

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


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

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


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

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

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


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

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

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

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

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

енумератор:

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


DVM   (2012-12-07 23:15:00) [64]


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

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

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


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

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


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

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


DVM   (2012-12-07 22:58:00) [67]


> Медвежонок Пятачок ©   (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 22:48:00) [68]

Хотя какая разница?
Нафик функции, нафик регулярки.
Раз это 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('зетс олл, фолкс! Все узлы "скрипт" удалены');


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

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

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


DVM   (2012-12-07 22:28:00) [70]


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

НИКАКОЙ.

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


Pcrepair   (2012-12-07 20:22:00) [71]

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

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

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


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


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

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

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


sniknik   (2012-12-07 09:53:00) [73]

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

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


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

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


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

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

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


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

http://stackoverflow.com/a/1732454


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

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

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


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


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

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


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

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


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

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


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

Наверх

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