我正在尝试编写与第一个结尾表单标记匹配的正则表达式。
<form.*name="loginForm".*>[^~]*</form>
上面的正则表达式匹配到第二个结束,直到第8行。但是我想要一个与下面示例中的标记的直接结尾匹配的正则表达式,它应该匹配第5行。
<html>
<body>
<form method = "post" name="loginForm" >
<input type="text" name="userName"/>
</form>
<form method = "post" name="signupForm" >
<input type="text" name="userName"/>
</form>
</body>
</html>
答案 0 :(得分:9)
只需使模式非贪婪,以便匹配尽可能少的字符而不是最大可能的字符:
<form[^>]*name="loginForm"[^>]*>[^~]*?</form>
编辑:
在表单标记中将.*
更改为[^>]*
,以使其与标记外部不匹配。
答案 1 :(得分:3)
使用真实的解析器,例如DOMDocument,SimpleXML或SimpleHTMLDOM。正则表达式不适合解析像HTML这样的非常规语言。
答案 2 :(得分:3)
您不应该使用正则表达式,而是使用DOM解析它:
使用Javascript:
var forms = document.getElementsByTagName('form');
forms[0] // is the first form element.
PHP:
$dom = new DOMDocument();
$dom->loadHTML( $html );
$forms = $dom->getElementsByTagName('form');
$first = $forms->item(0); // reference to first form
您可以使用minidom和ElementTree for Python。