我正在尝试构造一个正则表达式来查找可能嵌入了JSTL的空html标记。我正在使用Perl进行匹配。
到目前为止,我可以将任何不包含JSTL的空html标记与以下内容匹配?
/<\w+\b(?!:)[^<]*?>\s*<\/\w+/si
\b(?!:)
将避免匹配开放的JTSL标记,但这不会解决JSTL是否可能在HTML标记本身内(这是允许的)。我只想知道这个HTML标签是否没有子节点(只有空格或空格)。所以我正在寻找一种能够满足以下要求的模式:
<div id="my-id">
</div>
<div class="<c:out var="${my.property}" />"></div>
目前第一个div匹配。第二个没有。它可行吗?我使用先行断言尝试了几种变体,我开始认为它不是。 但是,我不能肯定或明确说明为什么不是。
编辑:我没有写一些东西来解释代码,我对使用解析器不感兴趣。我正在编写一个脚本来指出潜在的问题/疏忽。在这一点上,我很好奇,看看是否有一些我可能会缺少的前瞻或外观的聪明。如果您想以这种方式“解决”问题困扰您,请不要将其视为寻找解决方案。对我而言,现在更多的是挑战,并且有机会更多地了解正则表达式。
另外,如果它有帮助,你可以假设html是xhtml strict。
答案 0 :(得分:9)
尝试
<(\w+)(?:\s+\w+="[^"]+(?:"\$[^"]+"[^"]+)?")*>\s*</\1>
一个简短的解释:
< # match a '<'
(\w+) # match one or more a-z, A-Z, 0-9 or '_' and store it in group 1
(?: # open non-matching-group 1
\s+ # match one or more white space characters
\w+ # match one or more a-z, A-Z, 0-9 or '_'
=" # match '="'
[^"]+ # match one or more characters other than '"'
(?: # open non-matching-group 2
"\$ # match '"$'
[^"]+ # match one or more characters other than '"'
" # match '"'
[^"]+ # match one or more characters other than '"'
)? # close non-matching-group 2, and make it optional
" # match '"'
)* # close non-matching-group 1, and make repeat itself zero or more times
> # match '>'
\s* # match zero or more white space characters
</\1> # match '</X>' where `X` is what is captured in group 1
这适用于你的两个例子,但我相信有人可以构造你想匹配的html,但不会被正则表达式匹配。但在看完你的“编辑”后,你似乎意识到了这一点。
答案 1 :(得分:2)
将正则表达式用于HTML并不是一个好主意,因为大多数正则表达式系统都无法匹配许多构造。 HTML(与XHTML相对)也有许多困难的结构。建议你使用HTML解析器。 [这经常在SO上解决,普遍的答案是不使用正则表达式。)
答案 2 :(得分:1)
使用HTML解析器并不意味着您正在解释或运行内容:它意味着您正在将它从一串字符转换为嵌套对象。 HTML不是常规的,因此正则表达式不是解决此问题的最佳方法。
请参阅HTML::TreeBuilder的文档作为开始的好地方。其他好的资源包括HTML::Parser,当然还有this site。 :)
编辑:我假装你的问题与HTML无关,只是一个有趣的正则表达式拼图,因此会思考它...... ... [仍在思考..编辑即将来临] < / strike>(面对上面提到的非常棒的解决方案而放弃了这个难题)
答案 3 :(得分:0)
如果您认为您的输入是有效的XML,正如您所说,我选择的工具将是XML::Twig。
答案 4 :(得分:0)
基于我所读到的内容,我相信(?:是非捕获组而不是非匹配组,因此应该更改正则表达式的注释。
不匹配的组将是(?!