使用问题中链接中的示例作为基础,我设法将这个解决方案组合在一起。它似乎像一个魅力。它仅限于基于每个元素,但这实际上对我的目的非常有用。
我不知道这是否是最好的解决方案,但它对我有用。
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) ;