我有一个简单的问题:我想构建一个与HTML中的表单匹配的正则表达式,但前提是表单中有任何输入标记。例如:
应匹配以下内容(忽略属性):
..
<form>
..
<input/>
..
</form>
..
但以下不应该(忽略属性):
..
<form>
..
</form>
..
我已经尝试了从外观到捕获组的所有内容,但它很快变得复杂。我想相信有一个简单的正则表达式来捕捉问题。请注意,正则表达式必须根据HTML代码对开始和结束标记进行配对,这意味着以下操作不起作用:
<form>.+<input/>.+</form>
因为它错误匹配如下:
..
<form> <--- This is wrongly matched as the opening tag
..
</form>
<form> <-- This is the correct opening tag of the correct form
..
<input/>
..
</form> <--- This is matched as the closing tag
..
修改
我已经制作了符合我想要的RegEx;我的问题是现在该怎么做,但如何做到简单/优雅。 对我来说,这根本不简单或优雅:
<form>
(.(?<!</form>))+
<input/>
(.(?<!</form>))+
</form>
答案 0 :(得分:5)
我想相信有一个简单的正则表达式来捕捉问题
希望不是这样。没有证据表明每个问题都可以通过正则表达式解决,而且有大量证据可以证明。你的信仰不是很好。
正则表达式可识别的语言集合 - 不出所料 - 被称为常规语言。所有常规语言的一个很好的特性是它们可以被具有有限多个状态的设备识别。因此,您可以通过问自己“我是否需要无限数量的状态来识别这种语言?”来快速弄清楚某种语言是否不。
考虑匹配parens的语言:(),()(),(()),()(())等。要识别这种语言,你必须跟踪有多少打开的parens等待关闭,因此你需要一个无限数量的状态。因此,该语言不是常规语言,因此无法通过正则表达式进行匹配。
HTML显然是paren语言,但更复杂,因为现在有无数种不同的“parens”。每个标记都像一个开放的paren,必须与其对应的结束标记匹配。由于这是非常规语言的更复杂和困难的版本,显然它不能成为常规语言。因此它无法与正则表达式正确匹配。
识别HTML模式的正确工具是HTML解析器。
答案 1 :(得分:2)
您真的不想使用RegEx解析HTML。如果您需要更多信心,请参阅this answer。
正则表达式是尝试解析HTML的错误工具 - 尤其是当它的HTML不能很好地形成时。
您应该真正获得HTML / XHTML解析库并使用它来匹配HTML内容。看看HTML Agility Pack,它可能足以满足您的需求。
答案 2 :(得分:0)
答案 3 :(得分:0)
你应该not parse HTML with regular expressions,但如果你必须,那么简单如下:
<form>[^</form>]+<input/>.+</form>