允许在HTMLPurifier中具有特定前缀的类

时间:2014-07-19 13:23:16

标签: php htmlpurifier

是否可以配置HTMLPurifier以允许所有具有特定前缀的类?例如,我正在使用FontAwesome,并希望让用户能够使用它的图标,但是在数组中有太多不合理的硬编码。

这是我想做的,但它不会这样:

$config = HTMLPurifier_Config::createDefault() ;
$config->set('Attr.AllowedClasses', array('fa', 'fa-*')) ;

我发现this example,这表明它是可能的,但该页面上的代码实际上并没有像宣传的那样,而且有些部分对我来说是错误的。根据我的理解,它只允许a标签具有target属性,但不允许class属性,即使它应该检查前缀类。

1 个答案:

答案 0 :(得分:0)

使用问题中链接的示例作为基础,我设法将此解决方案合并在一起。它看起来像一个魅力。它仅限于每个元素,但这对我的目的来说非常好。

我不知道这是否是最佳解决方案,但它对我有用。

class CustomClassDef extends HTMLPurifier_AttrDef {
    private $classes, $prefixes ;

    public function __construct($classes, $prefixes) {
        $this->classes = $classes ;
        $this->prefixes = is_array($prefixes) ? join('|', $prefixes) : $prefixes ;
    }

    public function validate($string, $config, $context) {
        $classes = preg_split('/\s+/', $string) ;
        $validclasses = array() ;

        foreach ($classes as $class) {
            if (in_array($class, $this->classes) or
                preg_match("/^({$this->prefixes})/i", $class)) {

                $validclasses[] = $class ;
            }
        }

        return join(' ', $validclasses) ;
    }
}

$config = HTMLPurifier_Config::createDefault() ;
// Allow no classes by default
$config->set('Attr.AllowedClasses', array()) ;

$def = $config->getHTMLDefinition(true) ;
// Allow the class 'fa', and classes prefixed 'fa-' or 'foo-', on i tags
$def->addAttribute('i', 'class', new CustomClassDef(array('fa'), array('fa-', 'foo-'))) ;

// Allow classes prefixed 'language-' on code tags
$def->addAttribute('code', 'class', new CustomClassDef(array(), 'language-')) ;

$purifier = new HTMLPurifier($config) ;