使用 NodeJS ,我有以下正则表达式:/<[^>]*>/g
与HTML标记匹配:
(Live Demo)
我想反转比赛,以便捕捉文字,我尝试negative lookahead方法,没有运气。
修改 我正在避免使用split方法,因为我需要匹配的索引
JS可以吗?
答案 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解析器。
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;