2015-09-25 148 views
4

我的mysql數據庫表中的數據具有特殊字符,如'&'。防止編碼現有的HTML實體(轉換爲&但不是&至& amp;)

雖然使用,然後我需要將它們轉換爲&。我使用htmlspecialchars將它們轉換爲HTML實體。

但很少有條目已經有&,它將它們轉換爲&我需要它們直接使用,而無需轉換。

怎麼辦?

+0

這個問題是超級混亂。數據庫中的數據包含'&',您正在使用'htmlspecialchars()'將這些數據轉換爲HTML實體,但數據庫中還有其他一些條目具有'&',但您不希望這些特定條目通過'htmlspecialchars()'來轉換'&'? – Ohgodwhy

+0

你可能會想利用一個正則表達式來實現這一點。可能沿着'&(?! amp;)'的行應該標識「裸」符號。 – CollinD

+3

@ohgodwhy他有數據的混合。一些安全的HTML,有些不是。他要求簡單地清理裸號符號,但不是已經逃脫的「&」符號,因爲編輯答案時,感謝@​​Paul Crovella編寫了'&' – CollinD

回答

2

我認爲最好的解決方案是先解碼它們。正常的&將保持不變,但&被解碼爲&

然後再次編碼它們以將&和其他特殊字符轉換爲它們的編碼等價物。代碼比解釋短。 :)

$text = 'Your text with &s from the database'; 
// Decode and re-encode the special characters. 
$text = htmlspecialchars(htmlspecialchars_decode($text)); 

如果您有沒有其他實體以及(如éé),而不是htmlspecialchars,你也可以使用htmlentitieshtml_entity_decode。解決方案是相同的,但是您可以測試哪一個可以爲您提供最佳結果。

$text = 'Your text with &s from the database'; 
// Decode and re-encode the special characters and other entities. 
$text = htmlentities(html_entity_decode($text)); 

兩個htmlspecialcharshtmlentities支持doubleencode參數,默認情況下是真實的,但可以設置爲false。這也應該防止雙重編碼。這聽起來像解決方案更清潔,但我沒有使用它,我不知道它是否有任何副作用。

0

我更喜歡在數據庫中存儲純文本。

&保持&,é保持é,等...

從數據庫讀取的時候才 '組裝' 我用用htmlspecialchars HTML內容()。

這樣我就知道存儲的內容可以在任何地方使用,無論它是html還是文本。