2010-01-31 158 views
2

我有一個html文件,一個<pre>...</pre>標籤。匹配pre中的所有內容需要什麼正則表達式?Qt正則表達式匹配HTML標籤InnerText

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

回答

1

DO NOT PARSE HTML USING Regular Expressions!

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

+0

我不同意。如果您知道文件結構,那麼在其中查找內容不應該是正則表達式的問題。 – 2018-02-01 15:35:55

+0

@PredragManojlovic:如果文件結構稍微改變怎麼辦?如果有逃脫的字符怎麼辦? – SLaks 2018-02-01 16:45:13

+0

我很精確:「如果你知道文件結構很好」。意思是說,你已經生成了它,或者生成它的系統是一致的。 – 2018-02-01 21:37:33

3

HTML是不是一個regular language,你不經常使用表達式來解析它。

取而代之,請使用QXmlSimpleReader加載XML,然後使用QXmlQuery查找PRE節點,然後提取其內容。

+1

這樣一個簡單的文件?也許它更簡單的子字符串內容... – tfl 2010-01-31 13:54:56

+0

我不同意。如果您知道文件結構,那麼在其中查找內容不應該是正則表達式的問題。 – 2018-02-01 15:35:06

0

我做到了使用字符串:

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

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

結果包括<pre's>但是我發現這就是更好;)

-1

我與其他人同意。 Drupal 6.x和更高版本正在使用正則表達式來處理HTML數據。如果您創建64Kb或更多的頁面,它很快就會中斷。因此,使用DOM或僅僅使用indexOf()是一種更好的解決方案。

現在,對於那些有興趣瞭解更多關於正則表達式的人,Qt使用perl實現。這意味着你可以使用懶惰的操作符。你的正則表達式將變爲:(雖然如果你只有一個,那麼不需要問號和加)

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

得到<預>塊的每一個在你的代碼需要注意的是無定界符在這裏需要正則表達式的開始和結束。

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

現在名單應該有一個<預>標籤以上。

+0

只是一個註釋「?」不是一個貪婪的操作員。它是一個非貪婪的修飾符。 – 2018-02-02 01:54:50

+0

這就是爲什麼我使用「*?」。 – 2018-02-02 07:48:13

+0

是的,但它表示爲:「這意味着你可以使用貪婪的運算符」,而不是這意味着你可以使用非貪婪修飾符「 – 2018-02-02 13:34:22