正则表达式选择另一个html标记内的所有<br/>标签

时间:2013-01-13 06:11:19

标签: regex

我从另一个项目中采用了一些代码并且搞砸了。我想选择(并最终删除)所有<br/>代码,但只选择那些内部 <pre>代码。这有正则表达式吗?

These 2 lines should not be<br/>
touched. Example only.<br/><br/>

<pre class="code">mysql&gt;
<strong> SELECT state, COUNT(*) FROM president GROUP BY state;</strong><br/>
+-------+----------+<br/>
| state | COUNT(*) |<br/>
+-------+----------+<br/>
| OH    |        7 |<br/>
| PA    |        1 |<br/>
| SC    |        1 |<br/>
| TX    |        2 |<br/>
| VA    |        8 |<br/>
| VT    |        2 |
+-------+----------+</pre>

1 个答案:

答案 0 :(得分:0)

由于您没有提及该工具,我将假设您的正则表达式引擎支持\G 1 。请注意,这是原始正则表达式,您可能需要进行一些转义:

((?:<pre|\G(?!^))(?:(?!</pre|<\s*/?\s*br)[/s/S])*)<\s*/?\s*br\s*/?\s*>

替换:$1

一个重要的假设是输入中不能有(有效)嵌套pre标记。

Demo。 (注意:由于转义,演示可能会略有不同的正则表达式。)

((?:<pre|\G(?!^))(?:(?!</pre|<\s*/?\s*br)[/s/S])*)此部分搜索pre代码的开头,或从上一个匹配位置继续(其中找到br内的pre代码),然后抓取所有字符直到它达到有效的结束pre标记(并且必须向前跳过 - 因为正则表达式的下一部分与br标记匹配)或br标记。 (?!^)之后的\G是一种启发式方法,可以确保\G只有在pre标记内后才能匹配,否则,它也会匹配输入的开头。

有效标记的开头标记的<和标记名称之间不能有空格,并且</和结束标记的标记名称之间不能有空格。 Reference。此事实适用于检查pre标记的边界(pre标记仅在找到有效结束标记时结束)。但是,代码将匹配看起来像 br标记的任何标记(根据上述语法可能无效)并删除它们。

这是与br标记匹配的部分:<\s*\/?\s*br\s*\/?\s*>。如您所见,它甚至会匹配< /br></ br>< br></br/>等不良标记。我认为你不介意这些案件被清理干净。

<强>脚注

  1. 如果引擎支持\G最后一个匹配边界,那么它还应支持我在此正则表达式中使用的其他功能,例如否定前瞻(?!pattern)