【问题标题】:Inverse match for HTML tagsHTML标签的反向匹配
【发布时间】:2017-02-18 22:44:18
【问题描述】:

使用 NodeJS,我有以下正则表达式:/<[^>]*>/g 匹配 HTML 标记: (Live Demo)

我想反转匹配以捕获文本,我尝试了negative lookahead 方法,但没有运气。

编辑 我避免使用 split 方法,因为我需要匹配的索引

用JS可以吗?

【问题讨论】:

  • 用相同的正则表达式分割。
  • 对,我已经做到了......但是我需要匹配的索引
  • 链接到现场演示?
  • 如果您需要索引,只需匹配标签并使用最后一个标签的结尾和下一个标签的开头作为中间内容的索引?
  • @ShlomiSchwartz,你在node,所以使用像cheerio这样的HTML解析库。正则表达式不适合以这种方式处理 HTML。

标签: javascript regex node.js negative-lookahead


【解决方案1】:

用JS可以吗?

没有。 HTML 可以任意嵌套,这意味着您需要递归才能使用正则表达式来使用它——这是 JavaScript 正则表达式所没有的。

假设你可以抛弃 JS 并使用支持 PCRE 的语言,这个 由 Cthulhu 编写的一堆难以理解的字符 正则表达式可以解决问题 (mandatory regex101 link)(请注意,它不处理CDATA):

<!--[\s\S]*?-->|<([a-z]+)(?:\s\S+?=(["']|)[\s\S]*?\2)*>((?:[\s\S]*?(?R)?)*)<\/\1>

它是这样工作的:

  • &lt;!--[\s\S]*?--&gt;|是为了防止cmets造成误报
  • &lt;([a-z]+)(?:\s\S+?=(["']|)[\s\S]*?\2)*&gt; 是开始标签,其中
    • ([a-z]+) 是标签名称(注意捕获组 - 我们需要在结束标签中使用它)
    • (?:\s\S+?=(["']|)[\s\S]*?\2)* 是属性,其中
      • \s 是将属性与标签名称以及彼此分开的空格字符
      • \S+?= 是后跟等号的属性名称(注意惰性量词 - 我们需要它,因为 \S 包含 =
      • (["']|)[\s\S]*?\2 是值,可以用双引号、单引号或任何内容括起来
  • ((?:[\s\S]*?(?R)?)*) 是标签之间的文本(注意捕获组 - 这正是您需要的,将显示为组 3),其中 (?R)? 使正则表达式能够处理嵌套结构
  • &lt;\/\1&gt; 是结束标签,\1 是标签名称(记住开始标签中的捕获组)

【讨论】:

    【解决方案2】:

    由于给出的答案没有给出任何解决方案,因此您可以将以下代码用于没有嵌套标签的简单 [x]html。否则,对于完整的解决方案,请使用 HTML 解析器。

    var str = "Lorem ipsum <pre class='a1'>text 1</pre> Lorem ipsum <a href='http://google.com'>text 2</a>";
        str.replace(/<(\w+).*>(.*?)<\/\1>/g, function(match, g1, g2) { console.log(g2); });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多