Qt Regex匹配HTML Tag InnerText

时间:2010-01-31 13:31:00

标签: html regex qt

我有一个带有<pre>...</pre>标记的html文件。匹配pre的所有内容需要什么正则表达式?

QString pattern = "<pre>(.*)</pre>";
QRegExp rx(pattern);
rx.setCaseSensitivity(cs);

int pos = 0;
QStringList list;
while ((pos = rx.indexIn(clipBoardData, pos)) != -1) {
  list << rx.cap(1);
  pos += rx.matchedLength();
}

list.count()始终为0

4 个答案:

答案 0 :(得分:3)

HTML不是regular language,您不使用正则表达式来解析它。

相反,使用QXmlSimpleReader加载XML,然后使用QXmlQuery查找PRE节点,然后提取其内容。

答案 1 :(得分:1)

DO NOT PARSE HTML USING Regular Expressions!

相反,请使用真正的HTML解析器,例如this one

答案 2 :(得分:0)

我使用子串做到了:

int begin = clipBoardData.indexOf("<pre");
int end = clipBoardData.indexOf("</body>");

QString result = data.mid(begin, end-begin);

结果包括<pre's>,但我发现这更好;)

答案 3 :(得分:-1)

我必须同意其他人的意见。 Drupal 6.x及更早版本正在使用正则表达式对HTML数据进行大量工作。如果您创建64Kb或更高的页面,它会很快破裂。因此,使用DOM或仅使用indexOf()是一种更快更快的解决方案。

现在,对于那些有兴趣了解更多有关正则表达式的人,Qt使用了perl实现。这意味着您可以使用惰性运算符。你的正则表达式会变成:

(<pre>.*?</pre>)+

获取&lt; pre&gt;中的每一个在你的代码中阻塞(虽然如果你只有一个,那么问号和加号不是必需的。)请注意,这里不需要在正则表达式的开头和结尾处有分隔符。

QRegExp re("(<pre>.*?</pre>)+", Qt::CaseInsensitive);
re.indexIn(html_input);
QStringList list = re.capturedTexts();

现在列表应该有一个&lt; pre&gt;标签或更多。