2016-11-07 80 views
1

我在我的文本字段中使用HTML净化器(Yii2)。HTML净化器转换和 - > &

原需要保存“&”,但净化器转换为“& amp”;

我不想在净化器后使用str_replace

你能帮我配置吗?

我的配置:

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

UPD:

文字的例子,我想要什么净化: “公司名称&有限公司”

+2

为什么你需要保存'&'在原来的?你需要净化的环境是什么? – pinkgothic

+0

(如果您想知道我为什么要求,请参阅http://stackoverflow.com/a/37641037/245790和http://stackoverflow.com/a/26128263/245790。) – pinkgothic

+0

为什么? HTML允许'&'在空格后面显示为文字字符。 – Quentin

回答

0

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

我建议你从一个角度架构的角度重新审视这个,因为它有几个不足之处,比如,你失去了你的原始用户输入(你以后可能要分析任何一个原因),那一旦你想对数据做其他事情,你的数据库变得不那么有用了,而且你当前版本的HTML Purifier(可能与安全性有关)中的错误不会被消除。您可以在this answer中看到更多有关转义/消毒上下文重要性的信息。

也就是说,您的问题之前已经在HTML Purifier论坛上讨论过:Do not escape ampersand。该主题讨论了为什么以不同的方式处理&并保持安全,并且基本上“推荐”不使用HTML Purifier,这当然不能解决您的问题。

尽管如此,也有从该线程中的建议和想法可以帮助你,如果你不得不纯HTML存储在数据库中:

也许更有用的回答是:存储原始,用户在数据库中提交的数据(无需运行HTML Purifier),并在其上运行搜索查询。但是,存储在数据库中以及HTML纯化版本的缓存版本。

或(这使用<为例):

没有这样的布尔标志存在,这将是相当棘手的安全执行(你想要做一些愚蠢的类似转换文字<和朋友去一些伪造的一段文字,然后再转换& LT;字面版)

但后者并不是一个可靠的方法和前者是一种不必要的冗余。