2010-09-24 7 views
0

J'essaie d'écrire une expression regex de recherche et de remplacement qui détectera si le code HTML renvoyé par une requête Web est complet. J'ai eu des cas où le serveur retourne HTML incomplète (la moitié de la page), donc je veux détecter cela dans le client et demander à nouveau la page.Regex pour détecter le code HTML incomplet

Je pensais que la regex pourrait rechercher la présence de <html[^>]*>, puis l'absence de </html>. La partie remplacer remplacerait alors tout le HTML avec un peu de texte spécial.

Je ne peux pas simplement vérifier l'absence de </html> car les données renvoyées peuvent être un fichier texte, et je ne peux pas vérifier les types MIME.

Des idées? Je ne peux juste pas envelopper ma tête autour du look-behinds cela exigerait. Je n'essaie pas d'analyser HTML, juste de chercher des bits de texte, ce qui est à quoi servent les expressions rationnelles, n'est-ce pas?

EDIT:

Les regexes seront gérés par C#, mais je les écris dans un éditeur de regex. Je peux seulement utiliser une recherche et remplacer regex pour résoudre ceci, rien d'autre.

+0

S'il vous plaît ajouter un tag pour la langue que vous essayez de le faire en –

+4

Qu'en est-il une chaîne comme '

+1

Voir [commentaire de Bart K.] (http://stackoverflow.com/questions/3785861/regex-to-detect-incomplete-html#comment-4010395). – Gumbo

+1

@Gumbo: Bien sûr que j'ai fait. Je connais les limites (et je les ai mentionnées). Mais dans son cas, cela semble réalisable, car il peut exclure les cas qui déclencheraient cette regex. –

+0

Cela a frappé le spot! Je vous remercie. – Edgar

2

Cela n'est pas possible avec RegEx. Le HTML n'est pas une langue régulière, donc les pages incomplètes ne peuvent pas être vérifiées par RegEx.

Voir here pour pourquoi analyser HTML avec RegEx est une mauvaise idée.

Utilisez un analyseur HTML de validation pour votre plate-forme pour charger le code HTML et vérifier les erreurs de validation.

Vous devez savoir si un fichier est HTML ou non avant d'essayer de détecter si elle est incomplète HTML. Vous pouvez être en mesure de le faire en utilisant l'extension de fichier, si disponible, mais vous n'avez pas fourni suffisamment d'informations sur votre environnement pour qu'aucune recommandation soit faite.


Il est assez facile de trouver si <html et </html> existe dans une chaîne et sinon retourner une « chaîne spéciale ». Les fonctions de chaîne normales devraient suffire - pas besoin de RegEx.

+0

Je ne demande pas beaucoup. Je ne suis pas en train d'analyser le HTML. Tout ce dont j'ai besoin est une regex qui insère un peu de texte s'il y a une chaîne , mais pas de chaîne. – Edgar

+0

@Ed - alors s'il vous plaît _edit_ votre question et clarifier. – Oded

+0

Si je le pouvais, j'utiliserais autre chose, mais pour ce problème, je ne peux utiliser qu'une recherche et remplacer regex. – Edgar

0

En général, les expressions régulières ne sont pas appropriés pour décrire HTML, car les expressions régulières ne peuvent décrire regular languages mais HTML est pas une langue régulière. Le fait que HTML permette d'imbriquer des éléments dans une profondeur arbitraire le rend irrégulier.

Bien qu'il existe des implémentations d'expressions régulières qui prennent en charge des modèles récursifs (par exemple PCRE, .NET et al.), il faudrait une horrible expression régulière complexe pour décrire chaque code HTML valide.