Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Июнь 02, 2016, 00:02



Название: Как с помощью регулярных выражений удалить тег с атрибутами?
Отправлено: billy4685 от Июнь 02, 2016, 00:02
Доброй ночи, форумчанам. Я работаю с файлами html-справки, которые создавались ранее другими людьми в Microsoft Word-е, в результате чего в разметке страницы появилось множество тегов <span> типа: <span аргументы="">Текст</span>. Мне необходимо достать сам текст. Решил просто используя регулярное выражение просто удалить тег <span>. Но пока не знаю как правильно записать регулярное выражение, чтобы удалился открывающий тег  с внутренними аргументами и закрывающий тег, а текст остался. Пробовал следующим образом:
Код:
QString str = "<span ang=RU style='mso-ansi-language:RU'>Текст</span>";
str = str.remove(QRegExp("<span(.*)>")).remove(QRegExp("</span>"));
увы не сработало.
Решил тогда загонять текст в QTextDocument и пользуясь методом toPlainText() убирать теги, но в случаи с тегом <span> текст тоже удаляется. >:(

Может кто уже решал подобную задачу?
 


Название: Re: Как с помощью регулярных выражений удалить тег с атрибутами?
Отправлено: gil9red от Июнь 02, 2016, 01:18
Замену / replace делать? Т.е. ищем '<span.*>(.+)</span>' и все выражение заменяем на то, что находится в круглых скобках.
Я эту идею, когда сейчас придумал проверил на питоне и это работает:

Код
Python
>>> str = "<br><span ang=RU style='mso-ansi-language:RU'>Текст</span><hr>"
>>> import re
>>> re.sub('<span.*>(.+)</span>', '\\1', str)
'<br>Текст<hr>'


Название: Re: Как с помощью регулярных выражений удалить тег с атрибутами?
Отправлено: billy4685 от Июнь 02, 2016, 08:10
Код
Python
>>> str = "<br><span ang=RU style='mso-ansi-language:RU'>Текст</span><hr>"
>>> import re
>>> re.sub('<span.*>(.+)</span>', '\\1', str)
'<br>Текст<hr>'
Спасибо за ответ.
Вот только import никогда не использовал в qt, его не видет, может нужно какую-нибудь библиотеку подключать. В справке находит
только тот import, что в QML.


Название: Re: Как с помощью регулярных выражений удалить тег с атрибутами?
Отправлено: Igors от Июнь 02, 2016, 08:16
А если будет вложенный тег span ?


Название: Re: Как с помощью регулярных выражений удалить тег с атрибутами?
Отправлено: gil9red от Июнь 02, 2016, 09:10
Цитировать
Я эту идею, когда сейчас придумал проверил на питоне и это работает:

Код
Python
>>> str = "<br><span ang=RU style='mso-ansi-language:RU'>Текст</span><hr>"
>>> import re
>>> re.sub('<span.*>(.+)</span>', '\\1', str)
'<br>Текст<hr>'
Спасибо за ответ.
Вот только import никогда не использовал в qt, его не видет, может нужно какую-нибудь библиотеку подключать. В справке находит
только тот import, что в QML.

Используйте регулярку и алгоритм


Название: Re: Как с помощью регулярных выражений удалить тег с атрибутами?
Отправлено: billy4685 от Июнь 02, 2016, 10:11
gil9red, спасибо за ответ. Сделал следующим образом:
Код:
  QString temp;
  QString str = "<span\r\nlang=RU style='mso-ansi-language:RU'>Текст </span>";
  int pos = 0;
  QRegExp reg_exp("<span.*>(.+)</span>");

  while((pos = reg_exp.indexIn(str, pos)) != -1)
  {
temp = reg_exp.cap(1);
pos += reg_exp.matchedLength();
  }
  str = temp;
  qDebug() << str;
Но со вложенностями и несколькома тегами <span>, нужно будет как-то реализовывать другим образом.


Название: Re: Как с помощью регулярных выражений удалить тег с атрибутами?
Отправлено: Bepec от Июнь 02, 2016, 10:54
Парсинг и разбор html'я надо делать для вложенных тегов. По другому не получится :)