Форум: "Основная";
Текущий архив: 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