HTML 净化器转换 & -> &

HTML Purifier convert & -> &

我在我的文本字段中使用 HTML Purifier(Yii2)。

我需要在原版中保存“&”,但净化器转换为“&”;

我不想在净化器后使用 str_replace

你能帮我配置一下吗?

我的配置:

['name'],
'filter',
'filter' => function($value) {
    return HtmlPurifier::process($value, [
        'HTML.SafeObject' => true,
        'HTML.SafeEmbed' => true,
        'Core.EscapeNonASCIICharacters' => true,
        'Core.Encoding' => 'UTF-8'
    ]);
}

更新:

文本示例,我要净化的内容:"Company name & Co"

您在评论中提到您在将信息输入数据库之前要进行净化。

我建议您从架构的角度重新考虑这个,因为它有一些不足之处,例如您丢失了原始用户输入(您以后可能需要出于某种原因进行分析),一旦您想对数据执行其他操作,您的数据库就会变得不那么有用,并且您当前版本的 HTML Purifier(可能与安全相关)中的错误将不会出现冰释前嫌。您可以在 .

中查看有关 escaping/sanitising 对于上下文 的重要性的更多信息

也就是说,您的问题之前已在 HTML 净化器论坛上讨论过:Do not escape ampersand。该主题讨论了为什么难以以不同方式对待 & 并保持安全并且基本上 'recommends' 不使用 HTML 净化器,这当然不能解决您的问题。

尽管如此,如果您被迫将纯化的 HTML 存储在您的数据库中,那么该线程中的一些建议和想法可能会对您有所帮助:

Perhaps a more useful response would be: store the raw, user submitted data (without running HTML Purifier on it) in the database, and run search queries on that. However, store in the database as well a cached version of the HTML Purified version.

或者(以<为例):

No such boolean flag exists, and it would be reasonably tricky to implement safely (you'd want to do something silly like convert literal < and friends to some unforgeable piece of text and then convert &lt; to the literal version.)

但后者不是一个稳健的方法,前者是不必要的冗余。