我有一个带有<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
答案 0 :(得分:3)
HTML不是regular language,您不使用正则表达式来解析它。
相反,使用QXmlSimpleReader加载XML,然后使用QXmlQuery查找PRE节点,然后提取其内容。
答案 1 :(得分:1)
相反,请使用真正的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;标签或更多。