我试图删除斜体,粗体或跨度标签以外的所有标签,似乎无法使其工作。正则表达式匹配不是这个或那
目前,我有:
/[^i|b|span]/g
我明白,[]是范围,并且[跨度]将匹配S,P,A,N,而不是整个单词。
所以我的问题是如何声明:not: "tag1" or "tag2"?
编辑 我发现“重复”质询时,并没有解决我的问题。
我试图删除斜体,粗体或跨度标签以外的所有标签,似乎无法使其工作。正则表达式匹配不是这个或那
目前,我有:
/[^i|b|span]/g
我明白,[]是范围,并且[跨度]将匹配S,P,A,N,而不是整个单词。
所以我的问题是如何声明:not: "tag1" or "tag2"?
编辑 我发现“重复”质询时,并没有解决我的问题。
这应该工作,至少在相当整齐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 '>'
现在是什么做的英语?
它
<
/
,因为你想找到双方开始和结束标记(<body>
和</body>
)匹配的开始b
和i
开头!括号后面跟着\b
是为了确保它与OR列表中的“整个单词”相匹配。\w+
是匹配遵循任何标记(其中,我想提醒你,可能不是每负极先行i
,b
,或span
)。>
可能而不是出现在这样一个属性 - 它应该被编码为>
。因此,要匹配这个标签的末尾,请跳过任何不是>
的东西。>
结尾,以匹配结束。为什么在'顶部相当整齐的HTML'的警告?因为即使HTML被描述为极其详细的细节,手动输入HTML的软件和(唉)人都不会遵守所有这些讨厌的规则。这个正则表达式可能会出现一些可能的问题:
<br />
不会被捕获。>
属性值。 <img title="a > b">
会使它窒息 - <img
部分和标题的前半部分将被删除,但第二部分和最后的>
角色将保留。<B>
打开并关闭</b>
--但默认情况下,正则表达式通常区分大小写。你的正则表达式可能有一个Ignore Case标志;如果不是,则还需要添加大写字母。最好的补救措施是确保进入“in”的HTML已尽可能地干净。您可以使用常用工具(如HTMLTidy)预处理文件。更好的是:不要试图将“RegEx匹配开放标签,除了XHTML自包含标签”。 (将引用的文本粘贴到任何浏览器搜索引擎中获得一些乐趣。)更优越的解决方案是使用HTML解析器,并简单地踢出不喜欢的标签。如果您的HTML实际上是(正确形成的)XHTML,那么也可以使用广义的XML处理器语言XSLT来完成。
'[^ i | b | span]'是一个匹配除'a','b','i','n','p','s'或'|'以外的任何字符的正则表达式。 – bipll
@RadLexus - 它有效,但我不承认它的一部分,你能解释一下吗?我知道负面的看法,但不是其余。 – Karric