正则表达式不匹配这个或那个
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 '>'
这在英语中是什么意思?
它
- 寻找任何标签的开始
<
- 匹配一个可选的标签结束
/
因为你想找到开始和结束标签(<body>
和 </body>
)
- 跳过任意数量的空白(这里允许,而且 - 想想看 - 在其他几个地方。所以如果有必要,添加口味。)
- 否定前瞻的开始。这就是 Wiktor Stribiżew 提到的内容,并在 Regular expression to match a line that doesn't contain a word? 中进行了深入解释。
- 匹配 not 的短语的 OR 列表出现在前瞻中。我在周围添加了括号以将它们分组,因为 ...
- 还有其他以
b
和 i
开头的标签!括号后跟 \b
是为了确保它仅匹配 OR 列表中的 'whole words'。
- 下面的
\w+
是匹配后面的任何标签(我提醒你,可能不是是i
,b
,或 span
根据否定前瞻)。
- 但是 HTML 标签并没有就此结束! (至少,开始标签不会。)在标签名称本身之后,几乎可以出现任意数量的属性。大多数 HTML 编辑器和软件都会不经意地遵守一条规则,字符
>
可能 不会 出现在这样的属性中 – 它应该被编码为 >
。因此,要匹配直到 this 标记末尾的任何内容,请跳过任何不是 >
. 的内容
- ...由最后的
>
结束,以匹配结尾。
为什么 'fairly tidy HTML' 的警告在顶部?因为尽管 HTML 的描述非常详细,但手动输入 HTML 的软件和(唉)人类都没有遵守所有这些讨厌的规则。此正则表达式可能出现的一些问题:
- Self-closing 个标签。
<br />
不会被抓到
- 未转义
>
属性值。 <img title="a > b">
会让它窒息 – <img
部分和标题的前半部分将被删除,但第二部分和最后的 >
字符将保留。
- 随机大小写。 HTML 与标签中的大小写无关,您可以使用
<B>
打开并使用 </b>
关闭 - 但默认情况下正则表达式通常区分大小写。您的正则表达式风格可能有一个 Ignore Case 标志;如果没有,您还需要添加大写字符。
- 明显畸形HTML。 (没有治愈方法。)
- 可能还有无数其他人。
最好的补救措施是确保进入 "in" 的 HTML 已经尽可能干净。您可以使用 HTMLTidy 等常用工具来预处理您的文件。更好的是:不要尝试 "RegEx match open tags except XHTML self-contained tags"。 (将引用的文本粘贴到任何浏览器搜索引擎中以获得一些乐趣。)一个更好的解决方案是使用 HTML 解析器,并简单地踢出您不喜欢的标签。如果您的 HTML 实际上是(正确形成的)XHTML,这也可以使用 XSLT 来完成,通用的 XML 处理器语言。
我正在尝试删除除斜体、粗体或跨度标签以外的所有标签,但似乎无法正常工作。
目前,我有:
/[^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 '>'
这在英语中是什么意思?
它
- 寻找任何标签的开始
<
- 匹配一个可选的标签结束
/
因为你想找到开始和结束标签(<body>
和</body>
) - 跳过任意数量的空白(这里允许,而且 - 想想看 - 在其他几个地方。所以如果有必要,添加口味。)
- 否定前瞻的开始。这就是 Wiktor Stribiżew 提到的内容,并在 Regular expression to match a line that doesn't contain a word? 中进行了深入解释。
- 匹配 not 的短语的 OR 列表出现在前瞻中。我在周围添加了括号以将它们分组,因为 ...
- 还有其他以
b
和i
开头的标签!括号后跟\b
是为了确保它仅匹配 OR 列表中的 'whole words'。 - 下面的
\w+
是匹配后面的任何标签(我提醒你,可能不是是i
,b
,或span
根据否定前瞻)。 - 但是 HTML 标签并没有就此结束! (至少,开始标签不会。)在标签名称本身之后,几乎可以出现任意数量的属性。大多数 HTML 编辑器和软件都会不经意地遵守一条规则,字符
>
可能 不会 出现在这样的属性中 – 它应该被编码为>
。因此,要匹配直到 this 标记末尾的任何内容,请跳过任何不是>
. 的内容
- ...由最后的
>
结束,以匹配结尾。
为什么 'fairly tidy HTML' 的警告在顶部?因为尽管 HTML 的描述非常详细,但手动输入 HTML 的软件和(唉)人类都没有遵守所有这些讨厌的规则。此正则表达式可能出现的一些问题:
- Self-closing 个标签。
<br />
不会被抓到 - 未转义
>
属性值。<img title="a > b">
会让它窒息 –<img
部分和标题的前半部分将被删除,但第二部分和最后的>
字符将保留。 - 随机大小写。 HTML 与标签中的大小写无关,您可以使用
<B>
打开并使用</b>
关闭 - 但默认情况下正则表达式通常区分大小写。您的正则表达式风格可能有一个 Ignore Case 标志;如果没有,您还需要添加大写字符。 - 明显畸形HTML。 (没有治愈方法。)
- 可能还有无数其他人。
最好的补救措施是确保进入 "in" 的 HTML 已经尽可能干净。您可以使用 HTMLTidy 等常用工具来预处理您的文件。更好的是:不要尝试 "RegEx match open tags except XHTML self-contained tags"。 (将引用的文本粘贴到任何浏览器搜索引擎中以获得一些乐趣。)一个更好的解决方案是使用 HTML 解析器,并简单地踢出您不喜欢的标签。如果您的 HTML 实际上是(正确形成的)XHTML,这也可以使用 XSLT 来完成,通用的 XML 处理器语言。