正则表达式检测不完整的HTML

时间:2010-09-24 09:43:36

标签: c# regex

我正在尝试编写搜索并替换正则表达式,该正则表达式将检测Web请求返回的HTML是否完整。我有一些情况,当服务器返回不完整的HTML(页面的一半),所以我想在客户端检测到并再次请求页面。

我认为正则表达式可以查找<html[^>]*>的存在,然后找不到</html>。然后替换部分将用一些特殊文本替换整个HTML。

我不能只检查</html>是否缺席,因为返回的数据可能是文本文件,我无法检查MIME类型。

有什么想法吗?我无法将头围绕在这需要的后视镜上。我不是要解析HTML,只是搜索一些文本,这就是正则表达式,对吧?

编辑:

正则表达式将由C#运行,但我在正则表达式编辑器中编写它们。我只能使用搜索和替换正则表达式来解决这个问题,没有别的。

3 个答案:

答案 0 :(得分:3)

Oded是正确的。你不能用正则表达式解析 HTML。但是当然你可以看看某些(多行)字符串是否包含<html>后面没有</html>。如果您确定无论您的Web请求返回的内容是否一致且不包含任何奇怪的内容,例如评论中的html标记,那么

<html\b[^>]*>(?:(?!<\s*/\s*html).)*\Z
如果设置“点​​匹配换行符”选项,

将找到这样的字符串。如何执行此操作取决于您尚未提供的正则表达式实现。

<html\b[^>]*>          # match <html> tag
(?:                    # match the following:
  (?!<\s*/\s*html)     # If it's impossible to match </html here
  .                    # then match any character
)*                     # zero or more times.
\Z                     # Then assert that we are indeed at the end of the string

答案 1 :(得分:2)

使用RegEx无法做到这一点。 HTML不是常规语言,因此RegEx无法验证不完整的页面。

请参阅here了解为什么使用RegEx解析HTML是一个坏主意。

为您的平台使用验证HTML解析器来加载HTML并检查验证错误。

在尝试检测文件是否是不完整的HTML之前,您需要确定文件是否是 HTML。您可以使用文件扩展名(如果可用)执行此操作,但是您没有提供有关您的环境的足够信息以进行任何建议。


很容易找到字符串中是否存在<html</html>,如果不返回“特殊字符串”。正常的字符串函数应该足够 - 不需要RegEx。

答案 2 :(得分:0)

通常,正则表达式不适合描述HTML,因为正则表达式只能描述regular languages,但HTML不是常规语言。 HTML允许以任意深度嵌套元素这一事实使其不规则。

虽然有正则表达式实现支持递归模式(例如PCRE,.NET等),但它需要一个可怕的复杂正则表达式来描述每个有效的HTML代码。