我正在尝试使用正则表达式从字符串中删除所有 (某些) 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]单个实例的标签都没有删除,因为所有pre
,span
和{{1} }包含字符p
。但是,我只想忽略p
中的确切字符。
我期待的输出是[^\>,p,li,br,b]
。
我做错了什么?
答案 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,"");
此正则表达式与前导<
或</
匹配,前提是它后面没有您要保留的其中一个标记名称p
,li
,{{1 },br
(后跟一个空格或关闭b
,这样它就不会认为>
是<pre>
)。
然后它匹配结束<p>
之前的所有内容。
答案 1 :(得分:1)
请参阅此answer。
也就是说,方括号[]
匹配单个字符,而不是单词 - 有关你的内容的更多信息,请参阅本答案的底部。相反,您需要使用括号(?:p|li|br|b)
来匹配单词 - ?:
用于避免捕获。此外,括号将出现在方括号之外。
由于您使用的是否定匹配,因此您可能希望查看lookarounds;特别是关于正面和负面观察的部分。
[^\>,p,li,br,b]
转换为不是>
而不是,
而不是p
而不是,
而不是l
而不是i
{1}}而非,
而非b
而非r
而非,
而非b
。