使用正则表达式替换两个字符串之间的字符,同时忽略html标记和换行符

时间:2018-07-26 15:58:44

标签: javascript regex

我需要通过用█替换字符来删除已加载到字符串变量中的电子邮件中的健康信息。有问题的电子邮件需要在“健康问题?”之间添加内容。和“您工作了吗”替换了,但忽略了标签中出现的所有内容。另外,行通常用=符号包裹,这些新行,空格和=符号可以出现在标签的中间,也可以出现在用于标识开始和结束的字符串的中间。

示例:

(More content)
.....have any health issues? We currently do not have any health issues</sp=
an></li>
 <li id=3D"m_-622133557606915713yui_3_16_0_ym19_1_1515713539439_17326" styl=
e=3D"margin-top:0;margin-bottom:0;vertical-align:middle;line-height:15pt;co=
lor:black"><span id=3D"m_-622133557606915713yui_3_16_0_ym19_1_1515713539439=
_17327" style=3D"font-family:Arial;font-size:11.0pt">Some more text. 
Have
     you worked.....(more content)

我想知道有一种方法可以使用一个或多个正则表达式在javascript中做到这一点,但我不知所措。

所需结果如下:

(More content)
.....have any health issues?███████████████████████████████████████████</sp=
an></li>
 <li id=3D"m_-622133557606915713yui_3_16_0_ym19_1_1515713539439_17326" styl=
e=3D"margin-top:0;margin-bottom:0;vertical-align:middle;line-height:15pt;co=
lor:black"><span id=3D"m_-622133557606915713yui_3_16_0_ym19_1_1515713539439=
_17327" style=3D"font-family:Arial;font-size:11.0pt">███████████████
Have
     you worked.....(more content)

1 个答案:

答案 0 :(得分:1)

您可以使用两种replace方法来解决此问题。第一个将从health issues?Have you worked捕获的所有事物匹配为三个捕获组。我们对第二捕获小组感兴趣:

(health issues\?)([\s\S]*?)(Have\s+you\s+worked)
                  ^^^^^^^^

我们在此捕获的组上运行第二个replace方法,并用替换标记之外的每个字符。这是正则表达式:

(<\/?\w[^<>]*>)|[\s\S]

我们需要保留第一个捕获组(它们可能是HTML标记),并用提到的字符替换另一侧([\s\S])。

免责声明:这不是防弹的,因为正则表达式不应用于解析HTML标记。

演示:

var str = `(More content)
.....have any health issues? We currently do not have any health issues</sp=
an></li>
 <li id=3D"m_-622133557606915713yui_3_16_0_ym19_1_1515713539439_17326" styl=
e=3D"margin-top:0;margin-bottom:0;vertical-align:middle;line-height:15pt;co=
lor:black"><span id=3D"m_-622133557606915713yui_3_16_0_ym19_1_1515713539439=
_17327" style=3D"font-family:Arial;font-size:11.0pt">Some more text. 
Have
     you worked.....(more content)`;

console.log(str.replace(/(health issues\?)([\s\S]*?)(Have\s+you\s+worked)/, function(match, $1, $2, $3) {
    return $1 + $2.replace(/(<\/?\w[^<>]*>)|[\s\S]/g, function(match, $1) {
        return $1 ? $1 : '█';
    }) + $3;
}));