Удаление HTML элементов из текста.
Как-то раз пришлось решить задачу удаления из файла элементов HTML таких, как, например, ненужные ссылки, и в то эе время преобразования возврата каретки в HTML параграфы, знаков табуляции в пробелы и т.д. В результате соответственно должен был получиться новый HTML документ.
Следующие две процедуры показывают, как это можно сделать:
Листинг:
procedure TMainForm.LoadFileIntoList(TextFileName:String; AWebPage:TStringList; WithFilter:Boolean); var CurrentFile : TStringList; begin CurrentFile := TStringList.Create; CurrentFile.LoadFromFile(TextFileName); if WithFilter then FilterHTML(CurrentFile,AWebPage) else with AWebPage do AddStrings(CurrentFile); CurrentFile.Free; end; procedure TMainForm.FilterHTML(FilterInput, AWebPage:TStringList); var i,j : LongInt; S : String; begin FilterMemo.Lines.Clear; FilterMemo.Lines := FilterInput; with AWebPage do begin FilterMemo.SelectAll; j := FilterMemo.SelLength; if j > 0 then begin i := 0; repeat // ищем cr if FilterMemo.Lines.GetText[i] = Char(VK_RETURN) then S := S+'' else if FilterMemo.Lines.GetText[i] = '<' then repeat inc(i); until FilterMemo.Lines.GetText[i] = '>' // ищем tab else if FilterMemo.Lines.GetText[i] = Char(VK_TAB) then S := S+' ' // добавляем текст else S := S+ FilterMemo.Lines.GetText[i]; inc(i); until i = j+1; Add(S); // добавляем строку в WebPage end else Add('No data entered into field.'); // no data in text file end; end;
Применение функции:
Всё, что нужно сделать - это вызвать :
LoadFileIntoList("filename.txt",Webpage, True);
Где,
- filename - это имя файла, который вы хотите обработать.
- "WebPage" - это TStringList
- последний параметр в функции указывает, применять или нет HTML-фильтр.
PS: В этом примере объект TMemo (который вызывается из "FilterMemo") лежит на форме и поэтому не видим.
Пример:
WebPage := TStringList.Create; try Screen.Cursor := crHourGlass; AddHeader(WebPage); with WebPage do begin Add('Personal Details'); LoadFileIntoList("filename.txt",Webpage, True); end; AddFooter(WebPage); finally WebPage.SaveToFile(HTMLFileName); WebPage.Free; Screen.Cursor := crDefault; end;
Оставить комментарий
Комментарии
1.
17 августа 2005, 18:29:22
Да, для таких задач лучше пользовать Perl с регулярными выражениями - и компактнее и красивше :)
2.
23 июля 2005, 19:25:19
Serge, по-сути, замечание верное, но... пример не подходящий - на нем ошибка не проявится.
Более наглядна следующая последовательность:
<html>
...
<script>
// comment
code
code
code
</script>
Реально - следует добавить обработку (удаление) комментариев. Как однострочных, так и многострочных
Более наглядна следующая последовательность:
<html>
...
<script>
// comment
code
code
code
</script>
Реально - следует добавить обработку (удаление) комментариев. Как однострочных, так и многострочных
3.
22 июля 2005, 02:21:09
Однако не всё верно ...
---------8<-------------
...
<body>
V1
<script>
var a;
var b;
if(a<b) b=a;
if(a>b) a=b;
</script>
<h1>SOME TEXT</H1>
</body>
....
---------8<-------------
Что здесь имеется ввиду, кто догадается?
Вот именно, нужно строить иерархический набор объектов при входе в область действия тага и знать в зависимости от тага специфику использования разделяющих символов ...
А то мало того - весь скрипт наружу, так ещё и его обкорнает:
...
V1
var a;
var b;
if(ab) a=b;
SOME TEXT
...
Ну хотя бы при входе в <script искать его </script>.
---------8<-------------
...
<body>
V1
<script>
var a;
var b;
if(a<b) b=a;
if(a>b) a=b;
</script>
<h1>SOME TEXT</H1>
</body>
....
---------8<-------------
Что здесь имеется ввиду, кто догадается?
Вот именно, нужно строить иерархический набор объектов при входе в область действия тага и знать в зависимости от тага специфику использования разделяющих символов ...
А то мало того - весь скрипт наружу, так ещё и его обкорнает:
...
V1
var a;
var b;
if(ab) a=b;
SOME TEXT
...
Ну хотя бы при входе в <script искать его </script>.