首页 > 解决方案 > 如何使用 HtmlPurifier 向元素添加属性?

问题描述

我正在寻找使用 HtmlPurifier 包净化 HTML 并向某些元素添加属性。具体来说,我想向<div><p>元素添加类,以便:

<div>
    <p>
        Hello
    </p>
</div>

被纯化/转化为:

<div class="div-class">
    <p class="p-class">
        Hello
    </p>
</div>

如何使用 HtmlPurifier 进行此操作?是否可以?

标签: htmlpurifier

解决方案


我相信你可以通过按照这些思路做一些事情来做到这一点(尽管请把它当作伪代码,这个场景最后一次对我有用是几年前):

class HTMLPurifier_AttrTransform_DivClass extends HTMLPurifier_AttrTransform
{
    public function transform($attr, $config, $context) {
        $attr['class'] = 'div-class';
        return $attr;
    }
}
class HTMLPurifier_AttrTransform_ParaClass extends HTMLPurifier_AttrTransform
{
    public function transform($attr, $config, $context) {
        $attr['class'] = 'p-class';
        return $attr;
    }
}
$htmlDef = $this->configuration->getHTMLDefinition(true);
$div     = $htmlDef->addBlankElement('div');
$div->attr_transform_post[] = new HTMLPurifier_AttrTransform_DivClass();
$para    = $htmlDef->addBlankElement('p');
$para->attr_transform_post[] = new HTMLPurifier_AttrTransform_ParaClass();

如果您还没有,请记住将 和 的属性class列入白名单。divp

也就是说,乍一看,HTML Purifier 似乎不适合这种逻辑,因为添加类名与您网站的安全性无关(或者是吗?)。如果您已经在使用 HTML Purifier 将您的 HTML 标签、属性和值列入白名单,并且只想利用其 HTML 解析功能进行一些轻量级的附加 DOM 操作,我认为没有特别的理由不这样做。:) 但可能值得考虑是否要使用其他进程添加类(例如,在前端,如果这与您的用例相关)。


推荐阅读