我有一个用 perl 编写的过滤器,看起来像这样
my $tf = HTML::TagFilter->new(
allow => {
img => { src => [] },
b => { all => [] },
i => { all => [] },
em => { all => [] },
u => { all => [] },
s => { all => [] },
},
strip_comments => 1,
skip_xss_protection => 1,
);
现在当我像这样传递 html 时
<html>
<head>
<style><!--
..hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 12pt=3B
font-family:Calibri
}
--></style></head>
<body class=3D'hmmessage'><div dir=3D'ltr'>Message content here! =
</div></body>
</html>
输出是
<!--..hmmessage P{margin:0px;padding:0px}body.hmmessage{font-size: 12pt;font-family:Calibri}-->Message content here
如果你看输出发现style标签的内容还存在,我不知道为什么?那么谁能告诉我为什么style标签的内容在通过过滤器后仍然存在?
最佳答案
这是 HTML::TagFilter
的一个未记录的“特征”这是子类化的结果 HTML::Parser
.后者解释 <style>
和 <script>
将内容标记为 CDATA 并默认解析它们,忽略允许和拒绝的标记:
The script and style tags will always nest properly since their content is parsed in CDATA mode.
要解决这个问题只需调用
$tf->ignore_elements('style');
在您的 HTML 上调用解析方法之前 - 它会忽略样式标签并执行您想要的操作。请注意,在您的示例代码中,如果您替换 style
与 foo
, 不会打印任何评论。
关于html - 在 HTML::TagFilter 中需要帮助,摆脱样式标签内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943556/