Node.js正则表达式替换复杂HTML开放标记中的多个属性

aydmsdu9  于 2023-05-06  发布在  Node.js
关注(0)|答案(1)|浏览(178)

我正在做一个Node.js项目,在这个项目中,我们搜索了一堆PHP视图文件,并替换了一些属性。我试图获取HTML打开标记的属性值,并替换它们。
基本上,如果这是标签

<tag attr1="[capture ANYTHING inside single/double qoutes]" attr2='[CAPTURE ANYTHING]'></tag>

我想捕获属性引号中的任何内容。[ANYTHING]的意思是任何东西!

example2attr="with HTML <br/><b>also been captured</b>"
example3attr="with line break style \n or \n\r this is still is part of what should been captured and this line too!"
example4attr="a PHP code <?php echo $ThisPHPcodeisInsideTheQoutes?> should be captured as well!"
example5title="{{angular?'if inside the attribute': 'it should be acptured as well' }}"

我写了下一个正则表达式:
/<\w+\s+(:?[\w-]+=(:?"|')(.|[\r\n])*?\2\s*?)>?/g
这个正则表达式只捕获第一个属性。

regex breakdown:

**<**标签开始
**\w+**一个单词,主要是标签名这会强制避免PHP标签<?php
**\s+**一个空间或多个空间<tag attr
**(:?**非抓取组1,我想获取多个属性,但只抓取内容!
**[\w-]+**一个单词或-例如attrng-attr
**=等号属性
(:?"|')非捕获group 2开引号或双引号
(.|[\r\n])*?-我试图捕获的实际数据,捕获所有.[\r\n]换行符
\2
-返回引用
(:?"|')**所以我们有“[data]”或“[data]”
\s*?-在下一个标签之前有零个或多个空间不贪婪
)-关闭非捕获组1
>?-开始标记结束不贪婪
我不明白为什么没有捕获多个属性提前感谢您的帮助

ldioqlga

ldioqlga1#

我看不出这是如何可能做一个单一的正则表达式匹配。据我所知,你不能使用一个后向引用结束来匹配多个sub模式。
相反,我建议分两步处理HTML。首先,使用

/<\w+\s+[\w-]+=("|')(?:.|[\r\n])*?\1\s+.*?>/g

然后返回匹配项并使用

/([\w-]+=("|')(?:.|[\r\n])*?\2)/g

此时,您可以在第一个“=”上进行拆分,以将每个属性与其值分开。
Here is a fiddle implementing what I recommend.您的示例文本应该以您想要的方式解析出来。

相关问题