Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] QRegExp с multiline строкой 
:(
    Опции темы
SABROG
Дата 11.9.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Есть такой текст:

Код

<td class="table_left" title="Заголовок1"><a href="http://site.ru?t=8071" target="_blank">Заголовок1</a></td>
<td class="table_left" title="Заголовок2"><a href="http://site.ru?t=4009" target="_blank">Заголовок2</a></td>
<td class="table_left" title="Заголовок3"><a href="http://site.ru?t=2870" target="_blank">Заголовок3</a></td>
<td class="table_left" title="Заголовок4"><a href="http://site.ru?t=8070" target="_blank">Заголовок4</a></td>
<td class="table_left" title="Заголовок5"><a href="http://site.ru?t=5031" target="_blank">Заголовок5</a></td>


Пытаюсь его отпарсить таким макаром:

Код

    QRegExp rx(ui.lineEdit->text());
    ui.textEdit_2->clear();
    if (rx.indexIn(ui.textEdit->toHtml()) != -1) 
    {
        for (int i=1; i < rx.capturedTexts().size(); i++)
        {
            ui.textEdit_2->append(rx.capturedTexts()[i]);
        }
    }


В ui.lineEdit->text() находится такая регулярка:
Код

<td class=".*" title="(.*)"><a href="http://site.ru?t=\d+"


В качестве результата хочу видеть такое:

Код

Заголовок1
Заголовок2
Заголовок3
Заголовок4
Заголовок5


Ну никак не получается. Пробывал играться с QRegExp::setMinimal(true), тоже ноль эмоций. Максимум что удавалось получить:

Код

Заголовок1"а_тут_весь_оставшийся_html_текст


В общем стою на асфальте в лыжи обутый...


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Mal Hack
Дата 11.9.2008, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(SABROG @  12.9.2008,  00:18 Найти цитируемый пост)
В качестве результата хочу видеть такое:

Из ссылки?

"<a.+?>(.+?)</a>", дальше через cap(1) доставать.
PM ICQ   Вверх
SABROG
Дата 11.9.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Не, из title="(.*)". QRegExp даже так ничего не находит: "<a(.*)</a>". А так "(.*)" находит.
Или вот так: "td class="(.*)"" - находит все что после первой кавычки. А если добавить открывающий тег: "<td class="(.*)"" - то уже ничего не находит.

Это сообщение отредактировал(а) SABROG - 11.9.2008, 23:41


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
SABROG
Дата 12.9.2008, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



В общем от того чего я бежал, к тому и пришел. Без цикла while никуда, если хотим найти все вхождения:

Код

    QString str = QString::fromLocal8Bit("<td class=\"table_left\" title=\"Заголовок1\"><a href=\"http://site.ru?t=8071\" target=\"_blank\">Заголовок1</a></td>\n\
        <td class=\"table_left\" title=\"Заголовок2\"><a href=\"http://site.ru?t=4009\" target=\"_blank\">Заголовок2</a></td>\n\
        <td class=\"table_left\" title=\"Заголовок3\"><a href=\"http://site.ru?t=2870\" target=\"_blank\">Заголовок3</a></td>\n\
        <td class=\"table_left\" title=\"Заголовок4\"><a href=\"http://site.ru?t=8070\" target=\"_blank\">Заголовок4</a></td>\n\
        <td class=\"table_left\" title=\"Заголовок5\"><a href=\"http://site.ru?t=5031\" target=\"_blank\">Заголовок5</a></td>");

    QString pat = "<td class=\"table_left\" title=\"(.*)\"><a href=\"http://site\\.ru\\?t=\\d+\" target=\"_blank\">.*</a></td>";
    QRegExp rx(pat);
    rx.setMinimal(true);

    QStringList lststr;
    int pos = 0;

    while ((pos = rx.indexIn(str, pos)) != -1) 
    {
        lststr << rx.cap(1);
        pos += rx.matchedLength();
    }


Это сообщение отредактировал(а) SABROG - 12.9.2008, 08:58


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Mal Hack
Дата 12.9.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



SABROG, с точки зрения QRegExp я тебе сегодня не готов сказать решение, но, имея ооочень хороший опыт работы с PCRE, могу сказать, что если тебе нужен title, так и делай регулярку на него. Чем меньше рег, тем правильнее результат.
Тебе надо (по правилас PCRE) использовать регулярку: title=\"(.+?)\"
PM ICQ   Вверх
SABROG
Дата 13.9.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Я сегодня нашел очень неприятную особенность браузеров из-за которой ломал себе голову несколько часов, пытаясь понять, почему не работает регулярка. Например если смотреть исходники html странички в firefox, то мы можем увидеть такую картину:

Код

<a href=http://site.ru?t=8071&id=123 target=_blank>Заголовок1</a>


Если же смотреть "сгенерированную версию" (позволяют плагины для firefox), то картина уже такая:

Код

<a href="http://site.ru?t=8071&amp;id=123" target="_blank">Заголовок1</a>


Называется найди 10 отличий. Т.е. используя метод toHtml() в QWebView мы получим именно сгенерированную версию...


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Mal Hack
Дата 13.9.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(SABROG @  13.9.2008,  01:05 Найти цитируемый пост)
Называется найди 10 отличий. Т.е. используя метод toHtml() в QWebView мы получим именно сгенерированную версию... 

Ну это тоже обрабатывается.
Ты напиши четко, для чего тебе нужна регулярка. Сделаем.
PM ICQ   Вверх
SABROG
Дата 13.9.2008, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Mal Hack @ 13.9.2008,  00:15)
Цитата(SABROG @  13.9.2008,  01:05 Найти цитируемый пост)
Называется найди 10 отличий. Т.е. используя метод toHtml() в QWebView мы получим именно сгенерированную версию... 

Ну это тоже обрабатывается.
Ты напиши четко, для чего тебе нужна регулярка. Сделаем.

Да я ее сделал уже. Возникла проблема совсем другого плана. Хочу парсить содержимое QWebView в бесконечном цикле в главном потоке. Javascript обновляет страницу и я периодически ее сканирую вызывая processEvents вместе со sleep. В общем, чтобы ничего не подвисало. И оказалось, что если редирект идет на страницу без яваскрипта, который бы ее обновлял, то QWebView не реагирует ни на какие нажатия на ссылки, контролы html странички. А если щелкнуть правой кнопкой мышки, чтобы появилось меню копирования ссылки или вывести messagebox в любом месте, то клик сделанный минуту назад обрабатывается. Т.е. processEvents как-то странно работает.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.