如何移除字符串中除<s></s>外的所有HTML标签?
解决方案
要保留字符串中的<s>和</s>标签(包括带属性的<s ...>),同时移除所有其他HTML标签,你可以使用带有负向单词边界预查的正则表达式,精准区分<s>标签和其他以s开头的标签(比如<strong>、<span>)。
正确正则与代码示例
const cleanedContent = contents.replace(/<(?!\/?s\b)[^>]+>/gi, '');
正则说明
<:匹配HTML标签的起始字符(?!\/?s\b):负向预查,确保当前位置后不是/s(闭合标签)或s(起始标签)且紧跟单词边界——这意味着只有标签名严格为s的标签会被排除(不匹配),像<strong>这种标签名以s开头但后续还有其他字符的标签会被正常匹配并移除[^>]+:匹配标签内的所有内容直到>结束/gi:全局匹配(处理所有标签)+ 不区分大小写(兼容<S>、</S>这类写法)
效果验证
假设原始内容为:
<div>Hello <s>world</s>, <strong>this is a test</strong> <s class='strike'>another strike</s></div>
处理后输出:
Hello <s>world</s>, this is a test <s class='strike'>another strike</s>
为什么你之前的正则不行
<\/?(?!s)\w*\b[^>]*>:这个正则只排除标签名不以s开头的标签,导致<strong>、<span>这类以s开头的标签被保留,不符合需求<(?!s|/s).*?>:这个正则仅检查标签起始是否为s或/s,但不会判断标签名是否仅为s,因此<strong>这类以s开头的标签同样会被排除(不匹配),无法被移除
内容的提问来源于stack exchange,提问作者BFlow
相关产品推荐
相关产品推荐

