Javascript正则表达式剥离选择性html标签

时间:2013-12-05 13:58:15

标签: javascript html regex

我正在尝试使用正则表达式从字符串中删除所有 (某些) html标记。我目前正在尝试的内容如下:

var a = "<pre><code><p>This is a <span>test</span></p></code></pre>";
var b = a.replace(/(\<|\<\/)[^\>,p,li,br,b]*\>/ig,"");

但b的值返回为"<pre><p>This is a <span>test</span></p></pre>"

似乎所有包含[&gt;,p,li,br,b]单个实例的标签都没有删除,因为所有prespan和{{1} }包含字符p。但是,我只想忽略p中的确切字符。

我期待的输出是[^\>,p,li,br,b]

我做错了什么?

2 个答案:

答案 0 :(得分:3)

var a = "<pre><code><p>This is a <span>test</span></p></code></pre>";
var b = a.replace(/\<(?!\/?(p|li|br|b)[ >])[^>]*\>/ig,"");

此正则表达式与前导<</匹配,前提是它后面没有您要保留的其中一个标记名称pli,{{1 },br(后跟一个空格或关闭b,这样它就不会认为><pre>)。

然后它匹配结束<p>之前的所有内容。

答案 1 :(得分:1)

请参阅此answer

也就是说,方括号[]匹配单个字符,而不是单词 - 有关你的内容的更多信息,请参阅本答案的底部。相反,您需要使用括号(?:p|li|br|b)来匹配单词 - ?:用于避免捕获。此外,括号将出现在方括号之外。

由于您使用的是否定匹配,因此您可能希望查看lookarounds;特别是关于正面和负面观察的部分。


[^\>,p,li,br,b]转换为不是>而不是,而不是p而不是,而不是l而不是i {1}}而非,而非b而非r而非,而非b