Escaping SVG with KSES

时间:2018-08-27 作者:Picard102

我试图在模板中输出SVG文件,PHPCS告诉我需要转义输出。所以我尝试使用KSES,但它似乎不想包含viewbox属性。

 $allowed_html = array(
  \'svg\' => array(
    \'xmlns\' => array (),
    \'viewBox\' => true
  ),
  \'path\' => array(
    \'d\'=> array(),
  ),
);

 wp_kses(file_get_contents( $logo ), $allowed_html ) 
你知道为什么这样不行吗?

2 个回复
最合适的回答,由SO网友:mrwweb 整理而成

在我搜索答案时发现了您的问题。我试着用wp\\U kses做了更多的实验,发现下面的外壳viewbox 在争论中似乎解决了这个问题。您不必以小写形式将实际属性放在SVG上,只需wp_kses() 论点

这可能超出您的需要,但我现在使用的是:

<?php
$kses_defaults = wp_kses_allowed_html( \'post\' );

$svg_args = array(
    \'svg\'   => array(
        \'class\' => true,
        \'aria-hidden\' => true,
        \'aria-labelledby\' => true,
        \'role\' => true,
        \'xmlns\' => true,
        \'width\' => true,
        \'height\' => true,
        \'viewbox\' => true, // <= Must be lower case!
    ),
    \'g\'     => array( \'fill\' => true ),
    \'title\' => array( \'title\' => true ),
    \'path\'  => array( \'d\' => true, \'fill\' => true,  ),
);

$allowed_tags = array_merge( $kses_defaults, $svg_args );

echo wp_kses( $rich_text_that_might_include_SVGs, $allowed_tags );

SO网友:scsskid

伟大的解决方案@mrwweb

如果要在函数中使用此选项。php

<?php
function get_kses_extended_ruleset() {
    $kses_defaults = wp_kses_allowed_html( \'post\' );

    $svg_args = array(
        \'svg\'   => array(
            \'class\'           => true,
            \'aria-hidden\'     => true,
            \'aria-labelledby\' => true,
            \'role\'            => true,
            \'xmlns\'           => true,
            \'width\'           => true,
            \'height\'          => true,
            \'viewbox\'         => true, // <= Must be lower case!
        ),
        \'g\'     => array( \'fill\' => true ),
        \'title\' => array( \'title\' => true ),
        \'path\'  => array(
            \'d\'    => true,
            \'fill\' => true,
        ),
    );
    return array_merge( $kses_defaults, $svg_args );
}
模板:

<?php

echo wp_kses( $svg_code, get_kses_extended_ruleset() );

结束