【问题标题】:Regular expression to match empty HTML tags that may contain embedded JSTL?正则表达式匹配可能包含嵌入 JSTL 的空 HTML 标记?
【发布时间】:2010-04-02 09:33:30
【问题描述】:

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

【问题讨论】:

  • 我想知道我是否可以用锤子划船。我对船或锤子不是很感兴趣,所以不要把它想象成划船。对我来说,现在这更像是一个挑战,也是一个了解更多关于锤子的机会。

标签: html regex perl jstl


【解决方案1】:

试试

<(\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。但是在阅读了您的“编辑”之后,您似乎已经意识到了这一点。

【讨论】:

    【解决方案2】:

    对 HTML 使用正则表达式不是一个好主意,因为大多数正则表达式系统无法匹配许多结构。很多 HTML(相对于 XHTML)也有很多困难的结构。建议您使用 HTML 解析器。 [这在 SO 上经常得到解决,通用答案是不要使用正则表达式)。

    【讨论】:

    • 为什么这是每个正则表达式问题的答案?这不是正确的答案,他不想解析 html,他想匹配文本中的模式,这正是正则表达式的设计目的。
    • 这不是每个正则表达式问题的答案。当正则表达式是劣质工具时,这只是答案。
    • OP 询问“一个正则表达式来查找可能嵌入了 JSTL 的空 html 标签”,这就是我的答案。用正则表达式查找任何 HTML 标记是个坏主意。如果 Q 是“我如何用正则表达式解析这个 JSTL”,那么答案可能会有所不同
    【解决方案3】:

    使用 HTML 解析器并不意味着您正在解释或运行内容:它意味着您正在将其从字符串转换为嵌套对象。 HTML 不是正则的,所以正则表达式不是解决这个问题的最佳方法。

    请参阅HTML::TreeBuilder 的文档作为开始的好地方。其他好的资源包括HTML::Parser,当然还有this site。 :)

    编辑:我会假装您的问题与 HTML 无关,只是一个有趣的正则表达式难题,因此会思考它... ...[仍在思考.. 编辑即将到来](在上面提出的一个非常棒的解决方案面前放弃了这个谜题)

    【讨论】:

    • 他不想解析html,他想匹配文本中的模式。我听说正则表达式很擅长。
    • 从技术上讲,他应该解析 html,然后使用正则表达式在特定标签的内容中搜索..
    【解决方案4】:

    如果您假设您的输入是有效的 XML,正如您所说,我选择的工具是 XML::Twig

    【讨论】:

      【解决方案5】:

      根据我的阅读,我认为 (?: 是非捕获组而不是非匹配组,因此应该更改对正则表达式的评论。

      一个不匹配的组将是 (?!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-22
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        • 2011-04-01
        • 2022-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多