![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
bynet |
![]() ![]()
Сообщение
#1
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Мне надо написать html браузер. При написании его нельзя использовать практически никаких библиотек. Тоесть на читом visual studio. Без всяких STL, MFC. Но разрешили на qt,
Решил реализовывать использую регулярные выражения. Но стандартную библиотеку для работы с регуляными выражениями мне использовать нельзя. Как лучше организовать регулярные выражения(алгоритм)? Или может лучше будет организовать другим способом? |
|
|
ViGOur |
![]()
Сообщение
#2
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Столкнувшись с написанием конвертера HTML в WIKI формата, могу сказать точно, что регулярные выражения дял правильного разбора HTML использовать нельзя!
![]() Например с помощью регулярного выражения правильно разобрать конструкцию с произвольной вложенностью невозможно:
небольшую дискусию об этом можно прочитать в теме: Разбор трехэтажных вложенных тегов, <ol> <li>... То же относится к тэгам table или div, но с ними проще в отличии от приведенной мной выше конструкции. Поэтому думаю тебе стоит написать свой парсер, который в принципе для твоих нужд будет написать не сложно. |
|
|
bynet |
![]()
Сообщение
#3
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
bobdva |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 29 Регистрация: 2.10.2008 Из: Москва Пользователь №: 377 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Мне надо написать html браузер. При написании его нельзя использовать практически никаких библиотек. Тоесть на читом visual studio. Без всяких STL, MFC. Но разрешили на qt, Решил реализовывать использую регулярные выражения. Но стандартную библиотеку для работы с регуляными выражениями мне использовать нельзя. Как лучше организовать регулярные выражения(алгоритм)? Или может лучше будет организовать другим способом? судя по всему, с вашим пониманием проблемы курить и курить вам множество литературы, и про конечные автоматы, и про парсеры, да и базовые возможности qt тоже бы не плохо было бы посмотреть чуть детальней, чем писать свой HTML браузер . Кстати, WebKit в составе Qt не спасёт отца русской демократии ? FYI, Уже в m$ потенциально посматривают в сторону WebKit'а... Сообщение отредактировал bobdva - 13.11.2008, 23:15 |
|
|
bynet |
![]()
Сообщение
#5
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Мне надо написать html браузер. При написании его нельзя использовать практически никаких библиотек. Тоесть на читом visual studio. Без всяких STL, MFC. Но разрешили на qt, Решил реализовывать использую регулярные выражения. Но стандартную библиотеку для работы с регуляными выражениями мне использовать нельзя. Как лучше организовать регулярные выражения(алгоритм)? Или может лучше будет организовать другим способом? судя по всему, с вашим пониманием проблемы курить и курить вам множество литературы, и про конечные автоматы, и про парсеры, да и базовые возможности qt тоже бы не плохо было бы посмотреть чуть детальней, чем писать свой HTML браузер . Кстати, WebKit в составе Qt не спасёт отца русской демократии ? FYI, Уже в m$ потенциально посматривают в сторону WebKit'а... Я спрашиваю как это организовать... Тоесть как парсить на словах.. |
|
|
ViGOur |
![]()
Сообщение
#6
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Кстати, WebKit в составе Qt не спасёт отца русской демократии ? На сколько я знаю это ему в универе дали задание, а там как известно халява вроде Webkit'a не пройдет. ![]() Тоесть как я понимаю достаточно сделать вывод результата в консоль и не более того. ![]() Я спрашиваю как это организовать... Тоесть как парсить на словах.. У тебя есть массив символов, в цикле проходишь его и проверяешь на наличие открывающегося тэга или закрывающегося, дальше отображаешь даныне в зависимости от того, что за тэг.
|
|
|
bobdva |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 29 Регистрация: 2.10.2008 Из: Москва Пользователь №: 377 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Кстати, WebKit в составе Qt не спасёт отца русской демократии ? На сколько я знаю это ему в универе дали задание, а там как известно халява вроде Webkit'a не пройдет. ![]() Тоесть как я понимаю достаточно сделать вывод результата в консоль и не более того. ![]() а чем SAX Parser не устраивает для данной задачи ? ![]() сомневаюсь, что потребуется делать анализ html с ошибками с точки зрения xml (не закрытые теги, одиночные теги типа <br> и т.п) Сообщение отредактировал bobdva - 14.11.2008, 8:59 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
а чем SAX Parser не устраивает для данной задачи ? раз уж человеку STL нельзя использовать значит суть задания - построить синтаксический анализатор, читай SAX.Поэтому думаю тебе стоит написать свой парсер, который в принципе для твоих нужд будет написать не сложно. СогласенЯ предлагаю сделать отдельный клас в стиле SAX-reader'а который будет обнаруживать во входной символьной последовательности: 1) открывающийся тэг 2) закрывающийся тэг 2) ошибку |
|
|
kuler |
![]()
Сообщение
#9
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
kuler |
![]()
Сообщение
#11
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
kuler |
![]()
Сообщение
#13
|
![]() Танцор диско ![]() ![]() ![]() Группа: Участник Сообщений: 441 Регистрация: 11.9.2008 Из: Москва Пользователь №: 289 Спасибо сказали: 6 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#14
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
bynet |
![]()
Сообщение
#15
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Огромное спасибо буду пробовать.
Сообщение отредактировал bynet - 17.11.2008, 12:26 |
|
|
bynet |
![]()
Сообщение
#16
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Читаю строку QTextStream::readline как мне онализировать посимвольно эту строку?
|
|
|
AD |
![]()
Сообщение
#17
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
bynet |
![]()
Сообщение
#18
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Читаю строку QTextStream::readline как мне онализировать посимвольно эту строку? Можно с помощью регулярных выражений. Можно анализировать в цикле - ведь строка - это массив символов! ![]() Я понимаю что это массив символам, вопрос именно к ним обращаться? |
|
|
AD |
![]()
Сообщение
#19
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
А что именно хочешь? Я не очень понимаю. Вот так обращаться к ним:
Или еще что-то? ![]() |
|
|
bynet |
![]() ![]()
Сообщение
#20
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ок!
Вот у меня есть строка Qstring str="asd <h1>qwe</h2> fgh"; Делаю следующее QChar p; for (int i=0;i<str.size();++i); { if(str.at(i)== QChar('<')) Как из строки asd <h1>qwe</h2> удалить к примеру <h1> чтобы строка стала asd qwe</h2> fgh |
|
|
Litkevich Yuriy |
![]()
Сообщение
#21
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
bynet, яб тебе всетаки рекомендовал использовать подход SAX, т.к. ты можешь использовать С++.
Т.е. ты создаешь класс SAX-парсера, передаешь ему файл, а он выпоняет поиск тэгов. Посмотри примеры Qt'явые по SAX'у. в наследнике своего SAX-парсера переопределяешь функции такого вида: openTag(QString tag, QString text) closeTag(QString tag) первая вызывается парсером, когда он обнаруживает открывающийся текст, и в нее парсер передает имя тэга "foo" (<foo>) и строку, которую он обнаружил от этого отрывающегося тэга до символа "<" вторая вызывается, когда парсер обнаружил закрывающийся тэг "bar" (</bar>). |
|
|
bynet |
![]()
Сообщение
#22
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Огромное спасибо, но мне минимум можно использовать стандартных функций. Все практически надо написать самому. Тоесть если строку парсить то надо написать свой парсер
|
|
|
AD |
![]()
Сообщение
#23
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
QString & QString::remove ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive )
QString & QString::remove ( QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive ) Цитата QString & QString::remove ( const QString & str, Qt::CaseSensitivity cs = Qt::CaseSensitive ) This is an overloaded member function, provided for convenience. Removes every occurrence of the given str string in this string, and returns a reference to this string. If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive. This is the same as replace(str, "", cs). See also replace(). QString & QString::remove ( QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive ) This is an overloaded member function, provided for convenience. Removes every occurrence of the character ch in this string, and returns a reference to this string. If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive. Example: QString t = "Ali Baba"; t.remove(QChar('a'), Qt::CaseInsensitive); // t == "li Bb" This is the same as replace(ch, "", cs). QString & QString::replace ( const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive ) Цитата QString & QString::replace ( const QString & before, const QString & after, Qt::CaseSensitivity cs = Qt::CaseSensitive )
This is an overloaded member function, provided for convenience. Replaces every occurrence of the string before with the string after. If cs is Qt::CaseSensitive (the default), the search is case sensitive; otherwise the search is case insensitive. Example: QString str = "colour behaviour flavour neighbour"; str.replace(QString("ou"), QString("o")); // str == "color behavior flavor neighbor" |
|
|
bynet |
![]()
Сообщение
#24
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Вот к чему я пришел
CODE void Parser::open() { QString szLine; QString absFileName = QFileDialog::getOpenFileName(this,"Open File","","HTML files (*.html;*.htm)"); QFile file(absFileName); if (file.open(QIODevice::ReadOnly)){ QTextStream out(&file); do { szLine = out.readLine(); htmltostr(szLine); //textEdit->(szLine); }while( !szLine.isNull()); } file.close(); } void Parser::htmltostr(QString& htmstr) { Сюда приходит строка которую мне надо обработать!!!!!!! } Для каждой строки, как я понимаю надо вытянуть тег и текст который находится между им. Может кто посоветует чего? |
|
|
fsMark |
![]()
Сообщение
#25
|
![]() Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 23.4.2008 Из: г. Киров Пользователь №: 155 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Помоему надо строить дерево отрожающее структуру HTML файла
Например: <HTML> текст <br> <b> жырный текст </b> снова текст </HTML> Пример такого простейшего дерева приведен в прикрепленном файле, потом ты будешь обходить это дерево и отображать его. Без такой древовидной структуры будет сложно учитывать вложенность тегов например для таблиц. Сообщение отредактировал fsMark - 19.11.2008, 17:00
Эскизы прикрепленных изображений
|
|
|
trdm |
![]()
Сообщение
#26
|
Дмитрий Трошин ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 575 Регистрация: 12.1.2008 Пользователь №: 68 Спасибо сказали: 21 раз(а) Репутация: ![]() ![]() ![]() |
Как из строки asd <h1>qwe</h2> удалить к примеру <h1> чтобы строка стала asd qwe</h2> fgh QString.replace(); Месь, рекомендую покурить Ассистант. Он всегда поможет. Для каждой строки, как я понимаю надо вытянуть тег и текст который находится между им. Может кто посоветует чего? Поищите в интернете букварь по патернам, а в букваре поищите "рекурсивная композиция" или погуглите по "рекурсивная композиция/рекурсивный спуск". например тут: http://code.google.com/p/unnstudio/downloads/list http://ru.wikipedia.org/wiki/Метод_рекурсивного_спуска |
|
|
Litkevich Yuriy |
![]()
Сообщение
#27
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Помоему надо строить дерево отрожающее структуру HTML файла это DOM-подход, он сложен.Огромное спасибо, но мне минимум можно использовать стандартных функций. Все практически надо написать самому. Тоесть если строку парсить то надо написать свой парсер это я понял, я и предлагаю тебе свой парсер написать, но несквозной. А в стиле SAX, т.е. ты создаешь свой класс обзываешь его к примеру MySAX. Интерфейс выглядит примерно так:Интерфейс
В функции start(), собственно парсере, ты ищещ тэги (закрывающий и открывающий). Помере того как ты их находишь, вызываешь соответствующие методы. Например ты нашел открывающийся тэг, вызвал openTag(const QString &tag), в качестве аргумента передаешь имя тэга. Запоминашь позицию (номер символа)курсора сразу после тэга, ищешь слудющий тэг (или закрывающий или открывающий), когда нашел, то сначало берешь текст от запомненой позиции до текущей, передаешь его в text(const QString &text) затем вызываешь closeTag или openTag в зависимости от того какой тэг нашел. и т.д. А вот заготовка реализации: реализация
|
|
|
molchanoviv |
![]()
Сообщение
#28
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 597 Регистрация: 18.7.2008 Из: Саратов Пользователь №: 238 Спасибо сказали: 41 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 30.5.2025, 7:40 |