【问题标题】:Regex to match the first ending HTMl tag正则表达式匹配第一个结束 HTML 标记
【发布时间】:2009-09-22 05:38:32
【问题描述】:

我正在尝试编写一个匹配第一个结束表单标记的正则表达式。

  <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>

【问题讨论】:

  • 感谢您的快速回复和建议。我找到了我的答案。特别感谢 Guffa。

标签: html regex


【解决方案1】:

只需使模式不贪婪,以便它匹配尽可能少的字符而不是尽可能多的字符:

<form[^>]*name="loginForm"[^>]*>[^~]*?</form>

编辑:
将表单标签中的.*改为[^&gt;]*,使其在标签外不匹配。

【讨论】:

  • 嵌套标签将失败。不确定表单是否会嵌套,但使用正则表达式解析 HTML 仍然不是一个好主意,即使它在某些特定情况下有效。
  • @Guffa:那么你应该让所有量词都不是贪婪的。
  • 问题没有要求匹配的表单标签,它要求第一个,这可能不是最好的做法,但有时这是一个有效且有用的技巧。
  • @Chris:表单标签不能嵌套。
  • @Kevin:第一个结束标签是匹配标签。
【解决方案2】:

使用真正的解析器,例如 DOMDocumentSimpleXMLSimpleHTMLDOM。正则表达式不适合解析 HTML 等非常规语言。

【讨论】:

【解决方案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

您可以在 Python 中使用 minidom 和 ElementTree。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2011-07-25
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多