我的mysql數據庫表中的數據具有特殊字符,如'&'。防止編碼現有的HTML實體(轉換爲&但不是&至& amp;)
雖然使用,然後我需要將它們轉換爲&
。我使用htmlspecialchars將它們轉換爲HTML實體。
但很少有條目已經有&
,它將它們轉換爲&
我需要它們直接使用,而無需轉換。
怎麼辦?
我的mysql數據庫表中的數據具有特殊字符,如'&'。防止編碼現有的HTML實體(轉換爲&但不是&至& amp;)
雖然使用,然後我需要將它們轉換爲&
。我使用htmlspecialchars將它們轉換爲HTML實體。
但很少有條目已經有&
,它將它們轉換爲&
我需要它們直接使用,而無需轉換。
怎麼辦?
我認爲最好的解決方案是先解碼它們。正常的&
將保持不變,但&
被解碼爲&
。
然後再次編碼它們以將&
和其他特殊字符轉換爲它們的編碼等價物。代碼比解釋短。 :)
$text = 'Your text with &s from the database';
// Decode and re-encode the special characters.
$text = htmlspecialchars(htmlspecialchars_decode($text));
如果您有沒有其他實體以及(如é
爲é
),而不是htmlspecialchars
,你也可以使用htmlentities
和html_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));
兩個htmlspecialchars
和htmlentities
支持doubleencode
參數,默認情況下是真實的,但可以設置爲false。這也應該防止雙重編碼。這聽起來像解決方案更清潔,但我沒有使用它,我不知道它是否有任何副作用。
我更喜歡在數據庫中存儲純文本。
&保持&,é保持é,等...
從數據庫讀取的時候才 '組裝' 我用用htmlspecialchars HTML內容()。
這樣我就知道存儲的內容可以在任何地方使用,無論它是html還是文本。
這個問題是超級混亂。數據庫中的數據包含'&',您正在使用'htmlspecialchars()'將這些數據轉換爲HTML實體,但數據庫中還有其他一些條目具有'&',但您不希望這些特定條目通過'htmlspecialchars()'來轉換'&'? – Ohgodwhy
你可能會想利用一個正則表達式來實現這一點。可能沿着'&(?! amp;)'的行應該標識「裸」符號。 – CollinD
@ohgodwhy他有數據的混合。一些安全的HTML,有些不是。他要求簡單地清理裸號符號,但不是已經逃脫的「&」符號,因爲編輯答案時,感謝@Paul Crovella編寫了'&' – CollinD