正则表达式不匹配这个或那个

Regex match not this or that

我正在尝试删除除斜体、粗体或跨度标签以外的所有标签,但似乎无法正常工作。

目前,我有:

/[^i|b|span]/g

我知道 [] 是范围,[span] 将匹配 s、p、a、n,而不是整个单词。

所以我的问题是如何表述:not: "tag1" or "tag2"?

编辑 我之前找到了'duplicate'问题,并没有解决我的问题。

这应该可以工作,至少在相当整洁的情况下 HTML:

</?\s*(?!(i|b|span)\b)\w+[^>]*>

逐条解释(由http://rick.measham.id.au/paste/explain.pl提供):

NODE                   EXPLANATION
 <                     literal '<'
/?                     '/' (optional)
\s*                    any whitespace (\n, \r, \t, \f, and " ") (0 or
                       more times (matching the most amount
                       possible))
(?!                    look ahead to see if there is not:
  (                      start of OR'ed group
    i                        'i'
   |                        OR
    b                        'b'
   |                        OR
    span                     'span'
  )                      end of the OR'ed group
  \b                     the boundary between a word char (\w)
                         and something that is not a word char
)                      end of look-ahead
\w+                    word characters (a-z, A-Z, 0-9, _) (1 or
                       more times (matching the most amount
                       possible))
[^>]*                  any character except: '>' (0 or more times
                       (matching the most amount possible))
>                      literal '>'

这在英语中是什么意思?

  1. 寻找任何标签的开始 <
  2. 匹配一个可选的标签结束 / 因为你想找到开始和结束标签(<body></body>
  3. 跳过任意数量的空白(这里允许,而且 - 想想看 - 在其他几个地方。所以如果有必要,添加口味。)
  4. 否定前瞻的开始。这就是 Wiktor Stribiżew 提到的内容,并在 Regular expression to match a line that doesn't contain a word? 中进行了深入解释。
  5. 匹配 not 的短语的 OR 列表出现在前瞻中。我在周围添加了括号以将它们分组,因为 ...
  6. 还有其他以 bi 开头的标签!括号后跟 \b 是为了确保它仅匹配 OR 列表中的 'whole words'。
  7. 下面的\w+是匹配后面的任何标签(我提醒你,可能不是ib,或 span 根据否定前瞻)。
  8. 但是 HTML 标签并没有就此结束! (至少,开始标签不会。)在标签名称本身之后,几乎可以出现任意数量的属性。大多数 HTML 编辑器和软件都会不经意地遵守一条规则,字符 > 可能 不会 出现在这样的属性中 – 它应该被编码为 &gt;。因此,要匹配直到 this 标记末尾的任何内容,请跳过任何不是 >.
  9. 的内容
  10. ...由最后的 > 结束,以匹配结尾。

为什么 'fairly tidy HTML' 的警告在顶部?因为尽管 HTML 的描述非常详细,但手动输入 HTML 的软件和(唉)人类都没有遵守所有这些讨厌的规则。此正则表达式可能出现的一些问题:

  1. Self-closing 个标签。 <br />不会被抓到
  2. 未转义 > 属性值。 <img title="a > b"> 会让它窒息 – <img 部分和标题的前半部分将被删除,但第二部分和最后的 > 字符将保留。
  3. 随机大小写。 HTML 与标签中的大小写无关,您可以使用 <B> 打开并使用 </b> 关闭 - 但默认情况下正则表达式通常区分大小写。您的正则表达式风格可能有一个 Ignore Case 标志;如果没有,您还需要添加大写字符。
  4. 明显畸形HTML。 (没有治愈方法。)
  5. 可能还有无数其他人。

最好的补救措施是确保进入 "in" 的 HTML 已经尽可能干净。您可以使用 HTMLTidy 等常用工具来预处理您的文件。更好的是:不要尝试 "RegEx match open tags except XHTML self-contained tags"。 (将引用的文本粘贴到任何浏览器搜索引擎中以获得一些乐趣。)一个更好的解决方案是使用 HTML 解析器,并简单地踢出您不喜欢的标签。如果您的 HTML 实际上是(正确形成的)XHTML,这也可以使用 XSLT 来完成,通用的 XML 处理器语言。