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

时间:2016-09-01 10:50:09

标签: javascript regex node.js

我正在开发一个Node.js项目,在这个项目中我们正在搜索一堆PHP视图文件,并替换了一些属性。 我正在尝试获取HTML开放标记属性值,并替换它们。

基本上,如果这是标签

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

我想捕获属性引号内的任何内容。 并且[ANYTHING]我的意思是真的!

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

我写了下一个正则表达式:

  

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

这个正则表达式只捕获第一个属性。

带有一些演示数据的

Here is a fiddle

正则表达式分解:

  

< 标签开始
   \w+ 一个词,主要是标记名称,这将强制避免使用PHP标记<?php
   \s+ 空格或多个sapces <tag attr
   (:? 非捕获组1,我希望获得多个属性,但只捕获内容!
   [\w-]+ 一个字或-例如attrng-attr
   = 属性等号
   (:?"|') 非捕获组2打开引号或双qoutes
   (.|[\r\n])*? - 我尝试捕获的实际数据,捕获所有.[\r\n]换行符    \2 - 对 (:?"|') 的反向引用“[数据]”或“[数据]”    \s*? - 在下一个标记不贪婪之前零或多个sapces
   ) - 关闭非捕获组1    >? - 开头标记的结尾不是贪心

我不明白为什么没有捕获多个属性 在此先感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我不知道单个正则表达式匹配是如何做到的。据我所知,您无法使用反向引用匹配多个模式。

相反,我建议分两步处理HTML。首先,使用

提取开始标记字符串
/<\w+\s+[\w-]+=("|')(?:.|[\r\n])*?\1\s+.*?>/g

然后返回匹配并使用

提取每个属性/值对
/([\w-]+=("|')(?:.|[\r\n])*?\2)/g

此时,您可以拆分第一个“=”以将每个属性与其值分开。

Here is a fiddle implementing what I recommend.您的示例文本应该按照您希望的方式进行解析。