2011-06-30 24 views
1

由于某种原因,我必须每行都有一个HTML标签。所以,如果下面是输入:每行一个html标签的正则表达式

<p><div class="class1 <%= "class3" %>class2">div content</div></p> 

输出应该是:

<p> 
<div class="class1 <%= "class3" %>class2">div content 
</div> 
</p> 

正则表达式应该能够识别ERB脚本标记和HTML标记之间的差异。缩进不是必需的。

这怎么能通过正则表达式来完成?

+2

请参阅:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+3

正则表达式是错误的工具,您的示例代码是完美的那个例证。你的例子将打破几乎任何理智的正则表达式,并且随着你的发展,它会变得更加复杂。改用解析器。 –

+0

我相信@Paul和@Justin提出的建议。正则表达式不适合这种类型的工作。 我正在考虑@ Kobi的答案是否正确,因为它提供了所提供示例的解决方案。 – intellidiot

回答

3

您可以\n取代(?=<[\w/])。这是一个与位置匹配的符号,该符号在<符号之前,后面跟着一个字母或斜杠。 (另一种选择是(?=<(?!%)))。

这适用于您的发布代码,但在很多情况下失败,理论上<属性或<在服务器端脚本和JavaScript块中失败。如果你需要更复杂的东西,你可能需要一个更强大的解决方案,比如erb解析器。

+0

+1你拥有我这一个:) – Bohemian

1

">\n<"替换"(?<!%)>\s*<(?=!%))""\n</"

这可以确保%没有之前或之后>whitespace<发现更换"(?<!(\s|^))</"。 然后总是在</

打破我认为KOBI的回答是更好:)