如何阻止 htmlPurifier 自动解码 html 个实体?

How do I stop htmlPurifier from automatically decoding html entities?

我有一个奇怪的问题。我使用 CKEditor-4 以 html 的形式从用户那里收集格式化文本。此外,html 内容使用来自服务器的 html 净化器过滤。

当用户使用引号 时,CKEditor 将它们转换为 html 个实体,例如 ”’ , 和 “, 这很好。问题是,当我使用 htmlpurifier 过滤它们时 - 此引号会自动解码。这可以防止内容: 呈现给用户供以后编辑,因为引号字面上以 “

等策略编码

我该如何解决这个问题?我想,如果我能阻止 htmlpurifier 自动解码东西,这会起作用,但我是 htmlpurifier 的新手 - 所以我找不到方法。

在将它传递给 htmlpurifier 之前,我曾尝试使用 htmlentities。但它会编码整个 html,因此:完全停止 html 净化器净化 html。

经过 CBroe 的评论,我发现我的应用程序一直没有使用 UTF-8。

而且我也无法纠正。对于那些处于类似情况的人,我找到了解决方法。 htmlPurifier 确实支持对所有非 ASCII 字符进行编码并进行一些权衡的配置 - 这对我来说很好(我认为)。

您可以像这样启用 htmlpurifier 配置 Core.EscapeNonASCIICharacters

$config->set('Core.EscapeNonASCIICharacters', true);

这对我有用。


这是完整的功能

/**
 * Purifies dirty html
 *
 * @param string $dirty_html
 * @return string
 */
function purifyHtml($dirty_html)
{
    $config = HTMLPurifier_Config::createDefault();
    $config->set('Core.Encoding', 'UTF-8');
    $config->set('Core.EscapeNonASCIICharacters', true);
    $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
    $config->set('Cache.SerializerPath', getStoragePath('cache/html-purifier'));

    $htmlPurifier = new HTMLPurifier($config);
    return $htmlPurifier->purify($dirty_html);
}