正则表达式匹配可能包含嵌入式JSTL的空HTML标记?

时间:2009-11-10 05:10:48

标签: html regex perl jstl

我正在尝试构造一个正则表达式来查找可能嵌入了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。

5 个答案:

答案 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)

基于我所读到的内容,我相信(?:是非捕获组而不是非匹配组,因此应该更改正则表达式的注释。

不匹配的组将是(?!