wp_kses()不允许使用下划线

时间:2016-02-19 08:46:04

标签: php html wordpress

在wordpress中,wp_kses()函数删除除了允许的标签和属性之外的html标签和属性:

$post = "<p class="sample">This is a picture.<img src="sample.jpg" height="333"/><br/></p>";
$allowed = array(
   "p" => array(),
   "img" => array(
        "src" => array()
    ),
);
echo wp_kses($post, $allowed);
> <p>This is a picture.<img src="sample.jpg"/></p>

但是,我不能允许包含下划线的属性:

$post = "<p class="sample">This is a picture.<img src="sample.jpg" height="333" under_bar="some" /><br/></p>";
$allowed = array(
   "p" => array(),
   "img" => array(
        "src" => array(),
        "under_bar" => array()
    ),
);
echo wp_kses($post, $allowed);
> <p>This is a picture.<img src="sample.jpg"/></p>

我知道我应该使用其他名称,但我想知道使用underbar的解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我很确定没有解决方法,至少在其表单中不使用wp_kses()。如果您查看the code,您会发现WordPress在certain point处使用此属性under_bar="some"解析属性名称,以及稍后的值:< / p>

if ( preg_match('/^([-a-zA-Z:]+)/', $attr, $match ) ) {
    $attrname = $match[1];
    $working = $mode = 1;
    $attr = preg_replace( '/^[-a-zA-Z:]+/', '', $attr );
}

为清楚起见,它使用正则表达式来获取属性名称,并且它不接受下划线。结果,它继续认为您的属性被称为under,并且无法在允许的标签列表中找到它(即使它找到了它,其余的也可能因为名称错误而无效)

最容易做的事情可能只是使用破折号。您可以尝试巧妙地使用过滤器钩子来执行与wp_kses()不同的操作,但我认为它基本上就像重写整个事物。

答案 1 :(得分:0)

很可能。这是一个例子;

    <?php

                            $row_content = '<i class="fa fa-twitter" aria-hidden="true"></i>';
                            $allowed_html = array(

                                'i' => array(
                                    'class' => array(),
                                    'href'  => array(),
                                    'rel'   => array(),
                                    'title' => array(),
                                    'aria-hidden' => array()
                                )
                            );

                            ?>

                            <?php echo wp_kses( $row_content, $allowed_html ); ?>