【问题标题】:How to match the character '<' not followed by ('a' or 'em' or 'strong')?如何匹配字符'<'后面没有('a'或'em'或'strong')?
【发布时间】:2011-02-12 00:00:07
【问题描述】:

如何创建一个正则表达式来匹配字符 &lt; 后面没有(aemstrong

所以&lt;hello&lt;string 会匹配,但&lt;strong 不会。

【问题讨论】:

标签: javascript regex


【解决方案1】:

试试这个:

<(?!a|em|strong)

【讨论】:

  • +1 我认为这适用于 Perl 兼容的正则表达式语法。 (对于其他语法,可能会有所不同)
  • 以防万一有人感兴趣,?! 会启动否定前瞻。我在这里找到了一个很好的环视概述:rexegg.com/regex-lookarounds.html
  • 完整功能:myString.replace(/&lt;(?!\/?(a|em|strong)).*?&gt;/g, ''); 我还添加了\/? 以检查结束标签
【解决方案2】:

你使用negative lookahead,最简单的形式是(对于这个问题):

<(?!a|em|strong)

其中一个问题是它会忽略&lt;applet&gt;。解决这个问题的一种方法是使用\b,它是一个零宽度表达式(意味着它不捕获任何输入),它匹配一个词到非词或非词到词的转换。单词字符是[0-9a-zA-Z_]。所以:

<(?!(a|em|strong)\b)

【讨论】:

    【解决方案3】:

    如果您的正则表达式引擎支持它,请使用否定的超前断言:这会在字符串中超前,如果不匹配则成功;但是,它不消耗任何输入。因此,您希望/&lt;(?!(?:a|em|strong)\b)/:匹配&lt;,然后如果没有aemstrong 则成功,后跟一个分词符\b

    【讨论】:

    • 关于分词的有趣点,尽管 OP 没有说明是否需要这样做
    【解决方案4】:

    虽然 Andrew 的回答显然更胜一筹,但在此之前,我也让它与 [^(?:a|em|strong)] 一起使用。

    【讨论】:

      【解决方案5】:
      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>');
      }
      

      【讨论】:

        猜你喜欢
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-26
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多