【发布时间】:2011-02-12 00:00:07
【问题描述】:
如何创建一个正则表达式来匹配字符 < 后面没有(a 或 em 或 strong)
所以<hello 和<string 会匹配,但<strong 不会。
【问题讨论】:
标签: javascript regex
如何创建一个正则表达式来匹配字符 < 后面没有(a 或 em 或 strong)
所以<hello 和<string 会匹配,但<strong 不会。
【问题讨论】:
标签: javascript regex
试试这个:
<(?!a|em|strong)
【讨论】:
?! 会启动否定前瞻。我在这里找到了一个很好的环视概述:rexegg.com/regex-lookarounds.html
myString.replace(/<(?!\/?(a|em|strong)).*?>/g, ''); 我还添加了\/? 以检查结束标签
你使用negative lookahead,最简单的形式是(对于这个问题):
<(?!a|em|strong)
其中一个问题是它会忽略<applet>。解决这个问题的一种方法是使用\b,它是一个零宽度表达式(意味着它不捕获任何输入),它匹配一个词到非词或非词到词的转换。单词字符是[0-9a-zA-Z_]。所以:
<(?!(a|em|strong)\b)
【讨论】:
如果您的正则表达式引擎支持它,请使用否定的超前断言:这会在字符串中超前,如果不匹配则成功;但是,它不消耗任何输入。因此,您希望/<(?!(?:a|em|strong)\b)/:匹配<,然后如果没有a、em 或strong 则成功,后跟一个分词符\b。
【讨论】:
虽然 Andrew 的回答显然更胜一筹,但在此之前,我也让它与 [^(?:a|em|strong)] 一起使用。
【讨论】:
function strip_tags(str, keep){
if(keep && Array.isArray(keep)){keep = '|'+keep.join('|');}else if(keep){keep = '|'+keep;}else{keep = '';}
return str.replace(new RegExp('<\/?(?![^A-Za-z0-9_\-]'+keep+').*?>', 'g'), '');
}
用法:
strip_tags('<html><a href="a">a</a> <strong>strong text</strong> and <em>italic text</em></html>', ['strong', 'em']);
//output: a <strong>strong text</strong> and <em>italic text</em>
我还建议您从保留的标签中删除参数
function strip_params(str){
return str.replace(/<((?:[A-Za-z0-9_\-])).*?>/g, '<$1>');
}
【讨论】: