2015-09-07 143 views
4

如何使用PHP的html_entity_decode(),但數字HTML實體60和62的例外情況除外?數字HTML實體60和62的PHP html_entity_decode()例外

目前我的代碼看起來像下面這樣:

$t = mysqli_real_escape_string($db,html_entity_decode($_POST['title'],ENT_COMPAT,'UTF-8')); 

但是,如果我有一個編碼,以顯示在內容(就像你直接顯示符號到客戶端)脫字,他們也成爲編碼這導致了格式錯誤的HTML。所以我需要做一些例外,雖然我不知道如何做到這一點;用臨時佔位符替換字符串?我相信有更好的方法。

+1

'解碼'貼出的值的目的*是什麼?看起來像這樣做是有問題的。通常情況下,HTML輸入字段將*不*編碼任何值。 – user2864740

+0

我支持許多不同的非拉丁語言和客戶端瀏覽器,PHP和混合中的其他所有內容在每個oppertunity中跳轉以銷燬HTML實體,因此當編輯頁面時,我會將127個以上的所有**字符轉換爲數字HTML實體,他們安全......當把它們放到數據庫中時,長度成爲問題,但是SQL正確地支持Unicode/UTF-8,所以這是確保客戶端看到客戶端需要的最後一步。 :-) – John

+0

我不明白['html_entity_decode'](http://php.net/manual/en/function.html-entity-decode.php)是如何處理這種(或可以正確處理的) 。 – user2864740

回答

1

初步的答案,因爲這可能是一個XY-problem
解析HTML實體後,您可以「重新編碼」這些字符,可以通過htmlspecialchars傷害你的HTML結構。

$t = mysqli_real_escape_string(
    $db, 
    htmlspecialchars(
     html_entity_decode($_POST['title'],ENT_COMPAT,'UTF-8'), 
     'UTF-8' 
    ) 
); 
+0

我認爲存在的問題是,PHP將沒有線索或可能性來理解哪些插入符號將被編碼,哪些應該是實體。所以除非有內建的異常或不同的函數,我可以使用我應該創建我自己的函數,在使用'html_entity_decode()'之前和之後臨時執行字符串替換。 – John

+0

或者,您不是在存儲值時,而是在輸出時應用編碼。如果這對性能有負面影響 - >緩存;-) – VolkerK

+0

不幸的是,這對我來說會是雙重否定的。雖然編碼爲數字實體,但SQL字段的非常有意的限制(如元描述)並不能補償數字HTML實體,而且我真的無法承受一絲絲的時間來調整它,加上它沒什麼意義。此外,每當編輯器切換到HTML模式(從可視化)時,JavaScript都會以任何方式將代碼127上的所有字符轉換爲實體。我沒有看到替代我希望的雙字符串替換;我只想做客戶想要的東西。 :-) – John