![]() |
| ||
|
|
Новости |
Поиск |
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-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]Я бы прикрутил модуль регулярных выражений. В будущем можно будет легко модифицировать и код будет более понятен.