Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 18.10.2011
Сообщений: 3
1

Связать memo с текстом между тегами(html)

18.10.2011, 06:07. Просмотров 2985. Ответов 9


Хочу написать программу каторая бы облегчила жизнь HTML'щиков.Суть:
Допустим есть Html-страница(index.html) с таким содержанием:
HTML5
1
2
3
4
5
6
<html>
<title>Главная тестовая</title>
<body>
ТЕСТОВАЯ СТРАНИЦА
</body>
</html>
и есть оболочка программы(скрин во вложении screen.jpg)
для нее действует код(пока что знаю,то написал):

Delphi
1
2
3
4
5
6
7
procedure TForm1.Button2Click(Sender: TObject);
begin
opendialog1.execute;
Memo1.lines.loadfromfile(opendialog1.FileName);
end;
 
end.
цель:Нужно чтобы введя в memo2 любой текст(и нажав Button1 "изменить содержание страницы" этот текст направлялся в область между тегами <body> Текст из Memo2 </body>

вопрос : как мне реализовать это?обясните пожалуста,исходники бы очень помогли=)непинайте в гугл))
решив даннуюзадачу я аналогично построю все и для <title> текст </title>
Заранее Спасибо откликувшимся на мой долговременно нерешаемый вопрос!

ребят помогите,в 3 форум о Дельфи уже пишу,пока резулт:=0
 Комментарий модератора 
Теги кода добавлены модератором. По правилам форума, код должен быть оформлен соответствующими тегами.
Для оформления кода HTML следует выделить этот код и на панели редактирования сообщения нажать кнопку: "HTML".
Для оформления кода Delphi следует использовать кнопку: "DELPHI".
0
Миниатюры
Связать memo с текстом между тегами(html)  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2011, 06:07
Ответы с готовыми решениями:

Получить текст между тегами HTML
Как получить весь текст между тегами (&lt;div class=&quot;msg&quot;&gt; Текст.... &lt;br&gt; ....магия &lt;/div&gt;)

Парсинг между двумя тегами Html
Доброго времени суток. Уверен, на форуме было не мало подобных тем, но определенно этого запроса не...

Парсинг html: получить значение между тегами <a></a>
Я вот хочу написать парсер, наткнулся на код и он получал атрибуты href, я хотел получить значение...

Регулярное выражение, достать данные между html тегами
Доброго времени суток.Подскажите как можно регулярной функцией достать несколько данных между...

9
1299 / 705 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
18.10.2011, 06:47 2
такая уже есть. называется Zencoding.

Например в Notepad++ есть

демонстрация http://vimeo.com/7405114
0
0 / 0 / 0
Регистрация: 18.10.2011
Сообщений: 3
18.10.2011, 09:24  [ТС] 3
ну (какая разница есть или нет) ведь я хочу её сам написать и под себя и под других...
но незнаю как релизовать

Добавлено через 3 минуты
ну (какая разница есть или нет) ведь я хочу её сам написать и под себя и под других...
но незнаю как релизовать
0
1299 / 705 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
18.10.2011, 15:58 4
ну тогда уж лучше шаблонизатор статичных сайтов написать чем недоредактор html.

смысл шаблонизатора в следующем

есть шаблоны

1) :menu
HTML5
1
<div> <a href="blabla">сцылка 1</a> <a href="blabla">сцылка 2</a> </div>
2) :content
HTML5
1
2
3
<div> текст станицы верх</div> 
:menu
<div> текст станицы низ</div>
и станица сайта в виде шаблона тоже.

главная страница
HTML5
1
2
3
4
5
6
7
8
<html>
<head>
<title>Заголовок</title>
</head>
<body>
:content
</body>
</html>
и когда уже все составлено то сохраняем ("компилируем") страницу в уже готовую

главная страница - полный код
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
<title>Заголовок</title>
</head>
<body>
 
<div> текст станицы верх</div> 
 
<div> <a href="blabla">сцылка 1</a> <a href="blabla">сцылка 2</a> </div>
 
<div> текст станицы низ</div>
 
</body>
</html>
и получаем такой статичный сайт, в котором можно относительно легко менять содержимое страниц, изменив базовые шаблоны.

естественно тут надо для этого приложения хорошо продумать базу данных.

а сам алгоритм вставки шаблона будет работать через простую функцию StringReplace
0
0 / 0 / 0
Регистрация: 18.10.2011
Сообщений: 3
19.10.2011, 05:24  [ТС] 5
Alex_pac, я не собираюсь писать шаблонизатор))))нужна функция какаянибудь чтоле чтобы текст набранный в мемо заносился в область между тегами <body>текст набраный в мемо</body>.
Вот так.тема актуальна....
помогите решить
0
13062 / 5848 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
19.10.2011, 11:40 6
Acid_Burn, это надо получить доступ к объектной модели HTML документа (DOM). И через эту модель уже можно получить доступ к свойствам элементов (тегов). Чтобы работать с объектной моделью документа следует использовать модуль:
Delphi
1
2
uses
  MSHTML;
Сегодня вечером, если время будет - напишу пример.
0
1299 / 705 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
19.10.2011, 19:38 7
Delphi
1
Acid_Burn, это надо получить доступ к объектной модели HTML документа (DOM)
зачем? он с текстовыми файлами работает. Регулярное выражение на замену там надо а не DOM
0
13062 / 5848 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
20.10.2011, 03:51 8
Цитата Сообщение от Alex_pac Посмотреть сообщение
зачем? он с текстовыми файлами работает. Регулярное выражение на замену там надо а не DOM
Всё равно мы выйдем на DOM. Ведь парсить придётся для того, чтобы получить какие-то сведения о DOM. Чем сложнее документ, тем сложнее будет задача парсинга. И задача парсинга несравненно сложнее основной задачи - получать и изменять данные в модели документа (DOM). Более того - самостоятельно строить DOM по текстовым данным - это отдельная научно-техническая задача.
---
Итак, вот что получилось. Для удобства, есть смысл переключаться между несколькими интерфейсами OLE объекта, представляющего DOM.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
uses
  MSHTML, ActiveX;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  Fn = 'file.html';
var
  F : File;
  FileName : String;
  S : String;
  VS : Variant;
  i, Len : Integer;
  IDoc : DispHTMLDocument;
  IDoc2 : IHTMLDocument2;
  Elems : IHTMLElementCollection;
  Elem : IHTMLElement;
begin
  FileName := ExtractFilePath( ParamStr(0) ) + Fn;
  if not FileExists(FileName) then begin
    MessageDlg(
      'Заданный файл не найден. Действие отменено.'
      , mtWarning, [mbOk], 0
    );
    Exit;
  end;
 
  //Загружаем данные из файла в строку.
  AssignFile(F, FileName);
  Reset(F, 1);
  Len := FileSize(F);
  SetLength(S, Len);
  BlockRead(F, Pointer(S)^, Len);
  CloseFile(F);
 
  //Получаем доступ к OLE объекту, представляющему HTML DOM,
  //через интерфейс DispHTMLDocument.
  IDoc := CoHTMLDocument.Create;
 
  //Чтобы загрузить текстовые данные в объект документа, требуется
  //представить их в виде вариантного массива. Т. е., надо создать
  //вариантный массив из одного элемента и в качестве данных
  //элемента массива прикрепить строку.
  VS := VarArrayCreate([0, 0], varVariant);
  VS[0] := S;
  //Подключаемся к OLE объекту через интерфейс IHTMLDocument2.
  IDoc2 := IDoc as IHTMLDocument2;
  //Создаём содержимое документа на основе данных строки.
  IDoc2.write(PSafeArray(TVarData(VS).VArray));
 
  //Получаем содержимое элемента body.
  Memo1.Text := IDoc2.body.innerHTML;
  //Также можно установить новое содержимое для этого элемента.
  //IDoc.body.innerHTML := Memo1.Text;
 
  //Теперь, прочитаем сведения о всех элементах с тегом <A>: <a href="">...</a>.
 
  //Коллекция всех элементов с тегом <A>, имеющихся в документе.
  Elems := IDoc.getElementsByTagName('A');
  Memo2.Lines.Add('--------------------------------------------------');
  Memo2.Lines.Add('Перечень всех элементов с тегом <A> в документе:');
  for i := 0 to Elems.length - 1 do begin
    Elem := Elems.item(i, 0) as IHTMLElement;
    Memo2.Lines.Add(IntToStr(i) + ':');
    Memo2.Lines.Add(Elem.outerHTML);
    Memo2.Lines.Add('-----');
  end;
end;
Чтобы понимать, что означают свойства: innerHTML, outerHTML, методы: getElementsByTagName(), getElementsByName(), getElementById() и пр. - для этого надо познакомиться с моделью DOM (Document Object Model) HTML документа.
Очень удобно сведения представлены на сайте http://www.w3schools.com . Хотя он на английском, но большинство материалов на нём будут понятны, в том числе и тем, кто с английским языком знаком поверхностно.
С этого сайта:
Заглавный раздел по HTML DOM: JavaScript and HTML DOM Reference. На этой странице в разделе "HTML DOM Objects Reference" имеются ссылки на подразделы по HTML DOM. Ссылки имеются, также, в левой части страницы. По каждому материалу есть тестовые страницы, где прямо в он-лайн можно проверить, как работает HTML и/или JavaScript код.
---
По HTML DOM в сети есть, также, много материалов на русском языке.
0
1299 / 705 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
20.10.2011, 07:28 9
по вашему коду уже видно что надо создать пару функций-интерфейсов типо

GetElemebtBYId
GetElementsByTagName
GetElementsBYClassName

и тп

и тогда тогда задача разбора DOM будет проще
0
13062 / 5848 / 1705
Регистрация: 19.09.2009
Сообщений: 8,807
20.10.2011, 13:00 10
Я думаю, будет удобно весь механизм получения DOM модели спрятать в пару функций: GetDomFromStream() и GetDomFromFile(), которые будут возвращать интерфейс DispHTMLDocument. Далее, можно работать с этим интерфейсом, либо, если понадобится, его можно привести к IHTMLDocument2 - через "as IHTMLDocument2".
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
uses
  MSHTML, ActiveX;
 
//Построение модели HTML DOM по HTML коду из потока.
function GetDomFromStream(aStream : TStream) : DispHTMLDocument;
var
  S : String; //AnsiString
  VS : Variant;
  Len : Integer;
  IDoc2 : IHTMLDocument2;
begin
  //Загружаем данные из потока в строку.
  Len := aStream.Size;
  SetLength(S, Len);
  aStream.Read(Pointer(S)^, Len);
 
  //Получаем доступ к OLE объекту, представляющему HTML DOM,
  //через интерфейс DispHTMLDocument.
  Result := CoHTMLDocument.Create;
 
  //Чтобы загрузить текстовые данные в объект документа, требуется
  //представить их в виде вариантного массива. Т. е., надо создать
  //вариантный массив из одного элемента и в качестве данных
  //элемента массива прикрепить строку.
  VS := VarArrayCreate([0, 0], varVariant);
  VS[0] := S;
  //Подключаемся к OLE объекту через интерфейс IHTMLDocument2.
  IDoc2 := Result as IHTMLDocument2;
  //Создаём содержимое документа на основе данных строки.
  IDoc2.write(PSafeArray(TVarData(VS).VArray));
end;
 
//Построение модели HTML DOM по HTML коду из файла.
function GetDomFromFile(const aFileName : String) : DispHTMLDocument;
var
  Fs : TFileStream;
begin
  Fs := TFileStream.Create(aFileName, fmOpenRead, fmShareDenyNone);
  Result := GetDomFromStream(Fs);
  FreeAndNil(Fs);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  Fn = 'file.html';
var
  FileName : String;
  IDoc : DispHTMLDocument;
  Elems : IHTMLElementCollection;
  Elem : IHTMLElement;
  i : Integer;
begin
  FileName := ExtractFilePath( ParamStr(0) ) + Fn;
  if not FileExists(FileName) then begin
    MessageDlg(
      'Заданный файл не найден. Действие отменено.'
      , mtWarning, [mbOk], 0
    );
    Exit;
  end;
 
  //Подключаемся к HTML DOM.
  IDoc := GetDomFromFile(FileName);
 
  //Читаем сведения о первом элементе с тегом <BODY>.
 
  //Коллекция всех элементов с тегом <BODY>, имеющихся в документе.
  Elems := IDoc.getElementsByTagName('BODY');
  Memo1.Lines.Add('--------------------------------------------------');
  Memo1.Lines.Add('Содержимое "главного" элемента BODY в документе:');
  if Elems.length > 0 then begin
    Elem := Elems.item(0, 0) as IHTMLElement;
    Memo1.Lines.Add(Elem.outerHTML);
  end;
 
  //Читаем сведения о всех элементах с тегом <A>: <a href="">...</a>.
 
  //Коллекция всех элементов с тегом <A>, имеющихся в документе.
  Elems := IDoc.getElementsByTagName('A');
  Memo1.Lines.Add('--------------------------------------------------');
  Memo1.Lines.Add('Перечень всех элементов с тегом <A> в документе:');
  for i := 0 to Elems.length - 1 do begin
    Elem := Elems.item(i, 0) as IHTMLElement;
    Memo1.Lines.Add(IntToStr(i) + ':');
    Memo1.Lines.Add(Elem.outerHTML);
    Memo1.Lines.Add('-----');
  end;
end;
Здесь переменную IDoc можно перенести с уровня метода TForm1.Button1Click() на глобальный уровень модуля или сделать его полем в классе TForm1. Тогда построение DOM модели надо будет выполнять только при переходе к новому документу.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2011, 13:00

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

Как засунуть между тегами php, html скрипт?
Как засунуть между тегами php, html скрипт?

Как получить часть подстроки между двумя html-тегами?
Здравствуйте! Подскажите пожалуйста, как из этой строки &lt;TITLE&gt;Отчёт: &amp;lt;OMT-NEW&amp;gt;&lt;/TITLE&gt;...

Как задать цвет тексту между тегами html циклом
Всем здравствуйте.Я начинающий программист и пока все не просто дается. Нужно решить такую задачу....

Распарсить HTML страницу для получения теста между тегами
Собственно проблема заключается в том что не получается спарсить текст между тэгов, пробовал все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.