我在当前项目中使用HTMLPurifier,我不确定处理多个配置的最有效方法。在大多数情况下,唯一重要的变化是允许的标签。
目前,我在每个使用HTMLPurifier的类中都有一个私有方法,在需要配置时调用它,并从默认值创建一个。我对此并不满意,好像2个类使用相同的配置,这是重复的代码,如果一个类需要2个配置怎么办?它只是感觉很乱。
它的一个好处是,它是懒惰的,因为在它需要之前它不会创造任何东西。可以使用各种类,而不必净化任何东西。所以我不想创建一堆甚至可能无法使用的配置对象。
我刚刚发现你可以创建一个新的HTMLPurifier实例并直接设置如下的配置选项:
$purifier = new HTMLPurifier();
$purifier->config->set('HTML.Allowed', '');
我不确定这种形式是否完好,如果不是,我不确定是否可以使用它。
我最近的想法是创建一个配置处理程序类,它只返回一个HTMLPurifier配置,用于后续的净化调用。在某些时候它可能会扩展到允许设置配置,但从一开始我就认为它们只是硬编码并通过交换机运行方法参数来获取所请求的配置。也许我可以将存储的净化器实例作为参数发送,并让方法直接在其上设置配置,如上所示?
这对我来说似乎是我想到的几种方式中最好的,虽然我不确定这样的任务是否需要我创建一个类来处理它,如果是这样,如果我以最好的方式处理它
我不太熟悉HTMLPurifier的内部工作原理,所以我不确定是否有更好的机制来处理多个配置。
感谢任何人提供的任何见解。
答案 0 :(得分:2)
配置对象有一个重要的不变量:在它们用于执行纯化后,它们无法编辑。您可能对该类具有的convenience methods感兴趣,尤其是inherit
,您可以使用loadArray
加载一组值。
答案 1 :(得分:1)
我刚写了一个简单的快速配置处理程序类。
您可以查看/使用@ http://gist.github.com/358187/
在初始化时需要一系列配置。
$configs = array(
'HTML.Doctype' => 'HTML 4.01 Strict',
'posts' => array(
'HTML.Allowed' => 'p,a[href],img[src]'
),
'comments' => array(
'HTML.Allowed' => 'p'
),
'default' => array(
'HTML.Allowed' => ''
)
);
直接放入数组的指令是全局的,将应用于所有配置。如果在命名配置中设置了相同的指令,则将使用命名配置中的值。
然后你可以像这样获取一个配置:
$purifierConfig = new purifierConfig($configs);
$commentsConfig = $purifierConfig->getConfig('comments');
或,简写:
$commentsConfig = $purifierConfig['comments'];
如果请求的配置不存在或者未在呼叫中指定配置,则将返回默认配置。
我可能会在某些时候充实它,但是现在这很有效。
我一直在寻找人们如何在他们的项目中处理这些事情,或者是否有任何内置机制使这样的事情变得更加流畅,但我想我的问题范围有点过于狭窄。