我正在尝试编写一个搜索并替换正则表达式,它将检测web请求返回的HTML是否完整。我遇到过服务器返回不完整的HTML (页面的一半)的情况,所以我希望在客户端检测到这一点,并再次请求页面。
我在想,正则表达式可以先查找<html[^>]*>的存在,然后再查找</html>的缺失。然后,替换部分将用一些特殊文本替换整个HTML。
我不能仅仅检查是否没有</html>,因为返回的数据可能是一个文本文件,并且我不能检查MIME类型。
有什么想法吗?我就是不能理解这背后所需要的样子。我并不是要解析HTML,只是搜索一些文本,这就是正则表达式的作用,对吧?
编辑:
正则表达式将由C#运行,但我在正则表达式编辑器中编写它们。我只能使用搜索和替换正则表达式来解决这个问题,没有其他方法。
发布于 2010-09-24 17:54:14
奥德是正确的。您不能使用regex解析HTML。当然,你也可以看到一些(多行)字符串是否包含后面不跟</html>的<html>。如果您确信您的web请求返回的内容将是一致的,并且在注释中不包含任何奇怪的东西(如html标记),那么
<html\b[^>]*>(?:(?!<\s*/\s*html).)*\Z如果您设置了“点匹配换行符”选项,将会找到这样的字符串。如何做到这一点取决于您尚未提供的regex实现。
<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发布于 2010-09-24 17:46:08
使用RegEx时,这是不可能的。超文本标记语言不是一种常规语言,因此RegEx无法验证不完整的页面。
为什么用RegEx解析超文本标记语言不是一个好主意,请参阅here。
使用适用于您的平台的验证HTML解析器加载HTML并检查验证错误。
在尝试检测文件是否是不完整的HTML之前,您需要弄清楚该文件是否是HTML。您可以使用文件扩展名(如果可用)来执行此操作,但是您没有提供有关您的环境的足够信息,因此无法提出任何建议。
很容易找到字符串中是否存在<html和</html>,如果不存在,则返回一个“特殊字符串”。普通的字符串函数应该就足够了--不需要RegEx。
发布于 2010-09-24 18:01:12
一般来说,正则表达式不适合用来描述超文本标记语言,因为正则表达式只能描述regular languages,而超文本标记语言不是正则语言。HTML允许以任意深度嵌套元素的事实使其变得不规则。
尽管有支持递归模式的正则表达式实现(例如,PCRE、.NET等),但它需要一个可怕的复杂正则表达式来描述每个有效的HTML代码。
https://stackoverflow.com/questions/3785861
复制相似问题