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

出力を見ると、スタイル タグのコンテンツがまだ存在していることがわかりますが、その理由はわかりません。フィルターを通過した後もスタイル タグのコンテンツがまだ存在する理由を誰か教えてもらえますか?

4

1 に答える 1

1

これは文書化されていない「機能」でHTML::TagFilterあり、サブクラス化の結果ですHTML::Parser。後者はコンテンツを解釈<style><script>て CDATA としてタグ付けし、デフォルトでそれらを解析し、許可されたタグと拒否されたタグを無視します。

script タグと style タグは、コンテンツが CDATA モードで解析されるため、常に適切にネストされます。

ソース

この問題を解決するには、呼び出すだけです

$tf->ignore_elements('style');

HTML で parse メソッドを呼び出す前に、スタイル タグを無視して、必要なことを行います。styleサンプルコードでは、で置換するとfoo、コメントが出力されないことに注意してください。

于 2013-07-30T12:13:09.513 に答える