2010-01-31 6 views
2

J'ai un fichier html avec un tag <pre>...</pre>. Quel regex est nécessaire pour correspondre à tout le contenu dans les pré?Qt Regex correspond à HTML Tag 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() est toujours 0

Répondre

1

DO NOT PARSE HTML USING Regular Expressions!

Au lieu de cela, utilisez un véritable analyseur HTML, comme this one

+0

Je ne suis pas d'accord. Si vous connaissez bien la structure du fichier, trouver du contenu dans celui-ci ne devrait pas poser de problème avec l'expression régulière. –

+0

@PredragManojlovic: Et si la structure du fichier change légèrement? Et s'il y a des caractères échappés? – SLaks

+0

J'étais très précis: "Si vous connaissez bien la structure du fichier". Ce qui signifie que vous l'avez généré ou que le système qui le génère est cohérent. –

3

HTML est pas un regular language, vous n'utilisez pas régulière expressions pour l'analyser.

A la place, utilisez QXmlSimpleReader pour charger le fichier XML, puis QXmlQuery pour rechercher le noeud PRE, puis extraire son contenu.

+1

pour un simple fichier? peut-être que c'est plus simple de sous-traiter le contenu ... – tfl

+0

Je ne suis pas d'accord. Si vous connaissez bien la structure du fichier, trouver du contenu dans celui-ci ne devrait pas poser de problème avec l'expression régulière. –

0

je l'ai fait en utilisant des sous-chaînes:

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

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

Le résultat comprend le <pre's> mais j'ai découvert des thats encore mieux;)

-1

Je suis d'accord avec les autres. Drupal 6.x et plus utilisent regex pour faire beaucoup de travail sur les données HTML. Il casse rapidement si vous créez des pages de 64 Ko ou plus. Donc, en utilisant un DOM ou juste indexOf() comme vous l'avez fait est une meilleure solution beaucoup plus rapide. Maintenant, pour ceux qui sont intéressés à en savoir plus sur regex, Qt utilise l'implémentation Perl. Cela signifie que vous pouvez utiliser l'opérateur paresseux. Votre regex deviendrait: (. Bien que si vous avez un seul, le point d'interrogation et le signe plus ne sont pas nécessaires)

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

pour obtenir chacun des < bloc pré > dans votre code Notez qu'aucun délimiteurs à le début et la fin de l'expression régulière sont requis ici.

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

liste maintenant doit avoir une étiquette pré < > ou plus.

+0

Juste une note "?" n'est pas un opérateur gourmand. C'est un modificateur non-gourmand. –

+0

C'est pourquoi j'ai utilisé "*?". –

+0

Oui, mais il est indiqué comme: "Cela signifie que vous pouvez utiliser l'opérateur gourmand" au lieu de Cela signifie que vous pouvez utiliser le modificateur non-gourmand " –

Questions connexes