帮忙看看,为什么同样的正则语法,为什么结果不一样

问题:为什么第一句语法过滤不掉pre标签呢?

图片描述

--不好意思,代码忘记粘贴了下面是代码

t = '<pre>'
t = t.replace(/<(?!img|p(?!re)|\/p(?!re)|u(?!l)|\/u|em|\/em|b(?!utton|ody)|\/b(?!utton|ody)|div|\/div|strong|\/strong|video|\/video|hr|pre|table|\/table|tr|\/tr|td|\/td|thead|\/head|tbody|\/tbody|th|\/th).*?>/ig,'');
console.log(t);
t = '<pre>'
t = t.replace(/<(?!p(?!re)).*?>/ig,'');
console.log(t);
阅读 2.4k
3 个回答

?!?的意义混淆了
真正的问题应该不是第一句的正则不起效,实际上第二句正则也不对(试着运行下面结果)。

var str = ['<pre>','<pa>','<ap>'];
str.forEach(t=>{
    console.log(t.replace(/<(?!p(?!re)).*?>/ig,''))
})

你这正则不知道哪里复制过来的有很多问题
<(?!img|p(?!re)|\/p(?!re)|u(?!l)|\/u|em|\/em|b(?!utton|ody)|\/b(?!utton|ody)|div|\/div|strong|\/strong|video|\/video|hr|pre|table|\/table|tr|\/tr|td|\/td|thead|\/head|tbody|\/tbody|th|\/th).*?>

如果仅仅想解决问题的话这段正则中其中一段...|pre|...应该去掉
同理这段正则可以优化成下面这样
<(?!p(?!re)|\/?(?:ul|img|b(?:utton|ody)|u|em|div|strong|video|hr|t(?:able|r|d|head|body|h))).*?>

看图说话
clipboard.png
(?!condition1|condition2) 其中的?!表示,说白了就是不去匹配之后的几个condition,截图中有个pre,表示不匹配pre!所以第一句根本无法替换<pre>

题外话,我猜测你的意图是将所有html标签 全部替换掉? 那么请直接使用一句极短的正则即可 <[^>]+>

后续沟通得知,问题意图是想替换指定的 html标签,那么请这样写即可
<\s*(\/)?(img|pre|head|body|ul|em|button|div|strong|video|table|thead|th|tr|td|tbody|hr)[^>]*>

知识点普及: ?!?=这个在正则中术语叫"正向预查",一般用于匹配时定位, 比如 win(?=10) 会匹配所有后面有10的win。 而 win(?!10)会匹配后面不是10的win。 不太适合你这个场景。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题