HTML标记的反向匹配

时间:2016-10-10 13:30:58

标签: javascript regex node.js negative-lookahead

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

我想反转比赛,以便捕捉文字,我尝试negative lookahead方法,没有运气。

修改 我正在避免使用split方法,因为我需要匹配的索引

JS可以吗?

2 个答案:

答案 0 :(得分:1)

  

JS可以吗?

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

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

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

以下是它的工作原理:

  • <!--[\s\S]*?-->|用于防止评论导致误报
  • <([a-z]+)(?:\s\S+?=(["']|)[\s\S]*?\2)*>是开头标记,其中
    • ([a-z]+)是标记名称(请注意捕获组 - 我们将在结束标记中使用它)
    • (?:\s\S+?=(["']|)[\s\S]*?\2)*是属性,在哪里
      • \s是用于将属性与标记名称相互分隔的空格字符
      • \S+?=是属性名后跟一个等号(请注意延迟量词 - 我们需要它,因为\S包含=
      • (["']|)[\s\S]*?\2是值,可以用双引号,单引号或任何内容括起来
  • ((?:[\s\S]*?(?R)?)*)是标记之间的文字(注意捕获组 - 它正是您所需要的,并将显示为第3组),其中(?R)?使正则表达式能够处理嵌套构造
  • <\/\1>是结束标记,其中\1是标记名称(请记住开始标记中的捕获组)

答案 1 :(得分:0)

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

&#13;
&#13;
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); });
&#13;
&#13;
&#13;