4

我有一个用 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标签内容仍然存在?

4

1 回答 1

1

这是一个未记录的“功能”,HTML::TagFilter它是 sublasing 的结果HTML::Parser。后者将内容解释<style><script>标记为 CDATA 并默认解析它们,忽略允许和拒绝的标记:

脚本和样式标签将始终正确嵌套,因为它们的内容是在 CDATA 模式下解析的。

来源

要解决这个问题,只需调用

$tf->ignore_elements('style');

在您的 HTML 上调用 parse 方法之前 - 它会忽略样式标记并执行您想要的操作。请注意,在您的示例代码中,如果您替换stylefoo,则不会打印任何注释。

于 2013-07-30T12:13:09.513 回答