2016-04-11 27 views
0

我试图删除斜体,粗体或跨度标签以外的所有标签,似乎无法使其工作。正则表达式匹配不是这个或那

目前,我有:

/[^i|b|span]/g 

我明白,[]是范围,并且[跨度]将匹配S,P,A,N,而不是整个单词。

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

编辑 我发现“重复”质询时,并没有解决我的问题。

+0

'[^ i | b | span]'是一个匹配除'a','b','i','n','p','s'或'|'以外的任何字符的正则表达式。 – bipll

+0

@RadLexus - 它有效,但我不承认它的一部分,你能解释一下吗?我知道负面的看法,但不是其余。 – Karric

回答

2

这应该工作,至少在相当整齐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. 负面预测的开始。这就是WiktorStribiżew提到的内容,并在Regular expression to match a line that doesn't contain a word?中进行了深入解释。
  5. 与预期相符的短语的OR'ed列表而不是。我加了括号将它们分组,因为...
  6. 还有其他标签,以bi开头!括号后面跟着\b是为了确保它与OR列表中的“整个单词”相匹配。
  7. 以下\w+是匹配遵循任何标记(其中,我想提醒你,可能是每负极先行ib,或span)。
  8. 但HTML标签不会在那里结束! (至少,开放标签不会)。标签名称本身之后,可能会出现任何数量的属性。有一条规则,大多数HTML编辑器和软件随便观察到,字符>可能而不是出现在这样一个属性 - 它应该被编码为&gt;。因此,要匹配这个标签的末尾,请跳过任何不是>的东西。
  9. ...最终以>结尾,以匹配结束。

为什么在'顶部相当整齐的HTML'的警告?因为即使HTML被描述为极其详细的细节,手动输入HTML的软件和(唉)人都不会遵守所有这些讨厌的规则。这个正则表达式可能会出现一些可能的问题:

  1. 自闭标签。 <br />不会被捕获。
  2. 未转义的>属性值。 <img title="a > b">会使它窒息 - <img部分和标题的前半部分将被删除,但第二部分和最后的>角色将保留。
  3. 随机资本化。 HTML对标签大小写无关紧要,您可以用<B>打开并关闭</b>--但默认情况下,正则表达式通常区分大小写。你的正则表达式可能有一个Ignore Case标志;如果不是,则还需要添加大写字母。
  4. 明显错误的HTML。 (这是没有办法的。)
  5. 也许无数其他人。

最好的补救措施是确保进入“in”的HTML已尽可能地干净。您可以使用常用工具(如HTMLTidy)预处理文件。更好的是:不要试图将“RegEx匹配开放标签,除了XHTML自包含标签”。 (将引用的文本粘贴到任何浏览器搜索引擎中获得一些乐趣。)更优越的解决方案是使用HTML解析器,并简单地踢出不喜欢的标签。如果您的HTML实际上是(正确形成的)XHTML,那么也可以使用广义的XML处理器语言XSLT来完成。