正则表达式在html中找到<form>标签的无效放置</form>

时间:2011-04-07 15:36:29

标签: regex

我正在使用在<tr/>标记内包装<form/>标记的不幸做法,以便能够将单行内容作为表单发布到服务器。 HTML是通过XSL生成的,有时在<xsl:if/><xsl:choose/>之间有XSL流控制(<xsl:attribute/><form/>等)或<tr/>标记标签

示例:

<table>
  <tbody>
    <form id="row1_form">
      <xsl:if test="test">
        <xsl:attribute name="foo">bar</xsl:attribute>
      </xsl:if>
      <tr id="row1">
        ...

我正在尝试编写一个正则表达式,它会在“<tr”字符串后的某个位置找到“<form”字符串出现的所有位置。以下内容适用于此:

<form[^<]*?>[\s\w\<\:\>\/]*<tr

我真正需要的是,只有在“<table”和“<form”字符串之间不出现字符串“<tr”时才能匹配上述正则表达式。如果“<table”与“<form”之间未出现字符串“<tr”,则表示我发现表单标记无效。

谢谢, 马特

2 个答案:

答案 0 :(得分:1)

此正则表达式会找到一个包含<tr且前面没有<table的表单:

<form[^<]*(?:<(?!/?form|tr|table)[^<]*)*<tr\b

确实需要工具支持负向前瞻。请注意,此正则表达式实现了Jeffrey Friedl的展开循环效率技术并且非常快。

答案 1 :(得分:0)

如果您的正则表达式引擎支持负面外观,您可以执行以下操作:

<form[^<]*?>((?!<table)[\s\w\<\:\>\/])*<tr