是否可以配置HTMLPurifier以允许所有具有特定前缀的类?例如,我正在使用FontAwesome,并希望让用户能够使用它的图标,但是在数组中有太多不合理的硬编码。
这是我想做的,但它不会这样:
$config = HTMLPurifier_Config::createDefault() ;
$config->set('Attr.AllowedClasses', array('fa', 'fa-*')) ;
我发现this example,这表明它是可能的,但该页面上的代码实际上并没有像宣传的那样,而且有些部分对我来说是错误的。根据我的理解,它只允许a
标签具有target
属性,但不允许class
属性,即使它应该检查前缀类。
答案 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) ;