与HTML标签反向匹配
使用NodeJS ,我有以下正则expression式: /<[^>]*>/g
匹配HTML标签:( 现场演示 )
我想反转比赛,所以它会捕捉文字,我已经尝试了负向前瞻的方法,没有运气。
编辑我避免拆分方法,因为我需要匹配的索引
JS有可能吗?
JS有可能吗?
不,HTML可以任意嵌套,这意味着您需要recursion以便使用正则expression式来使用它 – JavaScript正则expression式没有的东西。
假设你可以抛弃JS并使用一种支持PCRE的语言,这个由Cthulhu正则expression式编写的怪异字符 就会发挥作用 ( 强制性的regex101链接 )(注意它不涉及CDATA):
<!--[\s\S]*?-->|<([az]+)(?:\s\S+?=(["']|)[\s\S]*?\2)*>((?:[\s\S]*?(?R)?)*)<\/\1>
这是如何工作的:
-
<!--[\s\S]*?-->|
是为了防止评论造成误报 -
<([az]+)(?:\s\S+?=(["']|)[\s\S]*?\2)*>
是开始标记,-
([az]+)
是标记名称(注意捕获组 – 我们将在结束标记中使用它) -
(?:\s\S+?=(["']|)[\s\S]*?\2)*
是属性,其中-
\s
是将标签名称和属性相互分开的空白字符 -
\S+?=
是后跟等号的属性名称(注意惰性量词 – 我们需要它,因为\S
包含=
) -
(["']|)[\s\S]*?\2
是可以用双引号,单引号括起来的值
-
-
-
((?:[\s\S]*?(?R)?)*)
是标签之间的文本(请注意捕获组 – 它正是您所需要的,并将以组3的forms出现 ),其中(?R)?
使正则expression式能够处理嵌套的构造 -
<\/\1>
是结束标签,其中\1
是标签名称(记住开始标签中的捕获组)
由于给定的答案没有给出任何解决scheme,所以你可以使用下面的代码为简单的[x] html没有嵌套标签。 否则,完整的解决scheme使用HTMLparsing器。
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); });