在HTML :: TagFilter中需要帮助,摆脱样式标记内容

时间:2013-07-30 09:43:26

标签: html perl

我有一个用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

如果你查看输出你发现样式标签的内容仍然存在,我不知道为什么?,那么任何人都可以告诉我为什么样式标签内容在通过过滤器后仍然存在?

1 个答案:

答案 0 :(得分:1)

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

  

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

Source

要解决此问题,只需调用

即可
$tf->ignore_elements('style');

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