我正在尝试编写搜索并替换正则表达式,该正则表达式将检测Web请求返回的HTML是否完整。我有一些情况,当服务器返回不完整的HTML(页面的一半),所以我想在客户端检测到并再次请求页面。
我认为正则表达式可以查找<html[^>]*>
的存在,然后找不到</html>
。然后替换部分将用一些特殊文本替换整个HTML。
我不能只检查</html>
是否缺席,因为返回的数据可能是文本文件,我无法检查MIME类型。
有什么想法吗?我无法将头围绕在这需要的后视镜上。我不是要解析HTML,只是搜索一些文本,这就是正则表达式,对吧?
编辑:
正则表达式将由C#运行,但我在正则表达式编辑器中编写它们。我只能使用搜索和替换正则表达式来解决这个问题,没有别的。
答案 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代码。