![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
bynet |
![]() ![]()
Сообщение
#1
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Есть програмка. Она открывает html файл и отображает его код. Надо при помощи регулярных выражений сделать чтобы отображался не html код а страничка. Обязательно это надо сделать при помощи регулярных выражениях.
Как сюда прикрутить регулярные выражения и вообще как их использовать? CODE #include <QtGui>
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent):QMainWindow(parent) { textEdit = new QTextEdit; setCentralWidget(textEdit); createActions(); createMenus(); } void MainWindow::createMenus() { menu = menuBar()->addMenu(tr("&File")); menu->addAction(openAct); } void MainWindow::createActions() { openAct = new QAction(tr("&Open..."), this); openAct->setShortcut(tr("Ctrl+O")); openAct->setStatusTip(tr("Open an existing file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); } void MainWindow::open() { QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) loadFile(fileName); } void MainWindow::loadFile(const QString &fileName) { QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, tr("Application"), tr("Cannot read file %1:\n%2.") .arg(fileName) .arg(file.errorString())); return; } QTextStream in(&file); QApplication::setOverrideCursor(Qt::WaitCursor); textEdit->setPlainText(in.readAll()); QApplication::restoreOverrideCursor(); } Сообщение отредактировал bynet - 19.5.2008, 16:34 |
|
|
LuckLess |
![]()
Сообщение
#2
|
Студент ![]() Группа: Новичок Сообщений: 31 Регистрация: 10.10.2007 Пользователь №: 8 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
я правильно понимаю? Нужно сделать полноценный парсер HTML при помощи регулярных выражений ?
![]() |
|
|
ViGOur |
![]()
Сообщение
#3
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
QTextEdit вроде как и без регулярных выражений умеет правильно отображать html странички, а не только код.
А обязательно регулярные выражения или как? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
видимо это задание такое, освоить регулярные выражения.
|
|
|
bynet |
![]()
Сообщение
#5
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
нужно освоить регулярные выражения, это в универе задание. Я понимаю что QTextEdit сам может это всё сделать, но нужно имеено рег.выражения использовать. Помогите пожалуйста.
Сообщение отредактировал bynet - 20.5.2008, 10:05 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
ну начни подбирать регулярные выражения, которые будут удалять теги, чтобы только текст остался.
Для этих экспериментов можно пользоваться разными программами: * %QTDIR%\examples\tools\regexp * RegExp Planner --- И ведь ты уже создавал тему "Регулярные выражения QT, отображение HTML", в ней бы и продолжал |
|
|
bynet |
![]()
Сообщение
#7
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
ну начни подбирать регулярные выражения, которые будут удалять теги, чтобы только текст остался. Для этих экспериментов можно пользоваться разными программами: * %QTDIR%\examples\tools\regexp * RegExp Planner --- И ведь ты уже создавал тему "Регулярные выражения QT, отображение HTML", в ней бы и продолжал А как мне с сылками быть? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
ну я думаю до ссылок доберешся в свое время, начни с простого.
|
|
|
Tonal |
![]()
Сообщение
#9
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Вообще-то задание довольно уродское: принципиальное ограничение регулярных языков - это неумение работать со структурами произвольной вложенности. Грубо говоря, нельзя написать регулярное выражение для проверки баланса скобок.
А html как раз является довольно ярким представителем языков с произвольной вложенностью. Хотя может быть задание как раз направлено на то, чтобы студенты как можно полнее осознали сей факт. ![]() Ну а как делать - вполне понятно. ![]() Если дружишь с python-ом - там один из парсеров html из стандартной поставки построен именно на regex-пах. Всего 370 строк легкочитаемого кода. ![]() |
|
|
bynet |
![]()
Сообщение
#10
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
насчет вложенности - минимально. Мне бы примерчик, например как заменить ссылку, или текст. А то в тех примерах столько много всего что сразу легко запутаться.
Возьмем к примеру такой код <html> <body> <a href="http://www.crossplatform.ru">Best qt forum</a> </bode> <html> вот как сделать с помощью рег.выражения, чтобы в QTextEdit отобразилась эта ссылка. Как я загружаю из файла показано в первом сообщении Сообщение отредактировал bynet - 20.5.2008, 13:41 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#11
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
как сделать с помощью рег.выражения, чтобы в QTextEdit отобразилась эта ссылка а я неуверен что это вообще получится. Как ты сделаешь ссылку, если на время забыть про регулярные выражения, вот есть у тебя адрес и текст который должен быть ссылкой, что ты должен сделать, чтобы он в QTextEdit отображался как ссылка? |
|
|
bynet |
![]()
Сообщение
#12
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
как сделать с помощью рег.выражения, чтобы в QTextEdit отобразилась эта ссылка а я неуверен что это вообще получится. Как ты сделаешь ссылку, если на время забыть про регулярные выражения, вот есть у тебя адрес и текст который должен быть ссылкой, что ты должен сделать, чтобы он в QTextEdit отображался как ссылка? незнаю как сделать с помощью рег.выражения, чтобы в QTextEdit отобразилась эта ссылка а я неуверен что это вообще получится. Как ты сделаешь ссылку, если на время забыть про регулярные выражения, вот есть у тебя адрес и текст который должен быть ссылкой, что ты должен сделать, чтобы он в QTextEdit отображался как ссылка? незнаю Вот мне сказали что можно вот так: CODE QString link = "http://www.crossplatform.ru";
QString text = "Best qt forum"; setHtml(QString("%2").arg(link).arg(text)); |
|
|
Litkevich Yuriy |
![]()
Сообщение
#13
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
отлично, значит надо шаблоны:
Выделяющий адрес, Выделяющий текст ссылки, а затем удаляющий тэги. Теперь идти учить регулярные выражения ![]() |
|
|
bynet |
![]()
Сообщение
#14
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
отлично, значит надо шаблоны: Выделяющий адрес, Выделяющий текст ссылки, а затем удаляющий тэги. Теперь идти учить регулярные выражения ![]() ![]() ![]() ![]() |
|
|
ViGOur |
![]()
Сообщение
#15
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
В переменной szLink будет строка:Цитата <a href="http://www.crossplatform.ru">Best qt forum</a> А потом вроде этого разбираешь на URL и текст.
|
|
|
bynet |
![]()
Сообщение
#16
|
![]() Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 17.3.2008 Из: Belarus Пользователь №: 124 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Данные в QString szData пробую добавить следующим образом: код ниже
Ругается следующим образом: Linking... mainwindow.obj : error LNK2019: unresolved external symbol "private: class QString __thiscall MainWindow::GetCap(class QString,class QString)" (?GetCap@MainWindow@@AAE?AVQString@@V2@0@Z) referenced in function "private: void __thiscall MainWindow::loadFile(class QString const &)" (?loadFile@MainWindow@@AAEXABVQString@@@Z) debug\borws.exe : fatal error LNK1120: 1 unresolved externals Build log was saved at "file://d:\unui\borws\debug\BuildLog.htm" borws - 2 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== CODE void MainWindow::loadFile(const QString &fileName)
{ QString szData; QString szRegExp = "^.*<html.*<body[^<>]*>(.*)</body.*"; QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, tr("Application"), tr("Cannot read file %1:\n%2.") .arg(fileName) .arg(file.errorString())); return; } QTextStream in(&file); QApplication::setOverrideCursor(Qt::WaitCursor); //textEdit->setPlainText(in.readAll()); szData.append(in.readAll()); QString szLink = GetCap( szRegExp, szData); textEdit->setPlainText(szLink); QApplication::restoreOverrideCursor(); } QString GetCap( QString szRegExp, QString szData) { QString szCap; QRegExp rx( szRegExp, Qt::CaseInsensitive); int pos = rx.indexIn( szData); if (pos > -1) { szCap = rx.cap( 1); } return szCap; } |
|
|
ViGOur |
![]()
Сообщение
#17
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Читай так:
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 11.7.2025, 5:20 |