2016-11-07 119 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;字面版)

但後者並不是一個可靠的方法和前者是一種不必要的冗餘。