【问题标题】:RegEx - Don't match if inner HTML tags existRegEx - 如果存在内部 HTML 标记,则不匹配
【发布时间】:2018-12-16 04:21:02
【问题描述】:

我已经整理了一个正则表达式(见下文),并且只有在没有内部 html 标记存在的情况下才能匹配

例子:

<b>asdf</b>

<b>asdf<i>asdf</i></b>

<b>asdf<i></b>

我的正则表达式/<([b])>(.+?)</([b])>/g 请看这个link

如果有内部 HTML 标记,有人能指出我正确的方向以确保正则表达式不匹配吗?

【问题讨论】:

标签: javascript regex regex-lookarounds


【解决方案1】:

对于您发布的示例,第一个问题是/ 具有特殊含义(正则表达式边界),需要转义。然后,如果我理解正确,您只想将 <b> 标记与内部文本匹配。一种基本方法是使用< 丢弃任何内容:

 /<(b)>([^<]+)<\/(b)>/

(旁注:b 不需要在 [] 内;除非你想分组,括号也可以去掉,导致:/&lt;b&gt;[^&lt;]+&lt;\/b&gt;/

现在,我们通常避免使用正则表达式来解析/分割 HTML,正如 RegEx match open tags except XHTML self-contained tags 的精彩回答所解释的那样。

在 javascript 中,有很多方法可以在不使用正则表达式的情况下仅获取文本。例如,请参阅Strip HTML from Text JavaScript

【讨论】:

    【解决方案2】:

    如果您必须为此使用正则表达式,则可以大大简化您的:匹配&lt;b&gt;,后跟除左尖括号外的任何内容,然后是&lt;/b&gt;

    const re = /<b>[^<]+<\/b>/;
    const str = `Aenean lacinia bibendum <a href="/life">life</a> sed consectetur. <a href="/work">Work</a> quis risus eget urna mollis ornare <a href="/about">about</a> leo. <a><asdf>asdf</asdf></a> <a>asdf</a>
    
    This should not match:
    <b><i>asdf</i></b>
    
    This should match:
    <b>asdf</b>`;
    console.log(str.match(re));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多