我正在寫在PHP接受到本地輸入文件作爲參數的路徑的命令行應用程序的數據類型。輸入文件將包含以下之一:確定從file_get_contents()函數
- JSON編碼關聯數組
- 甲
serialized()
版本聯合數組的 - 的
serialized()
關聯數組 - 基底的基底64編碼版本64編碼JSON編碼的關聯數組
- 一個普通的舊PHP關聯數組
- 垃圾
總之,有幾種不同的方案,我有過將被寫入該文件的控制權,以統一的方式,我可以理解,一旦我真的弄清楚格式。一旦我弄清楚如何攝入的數據,我可以運行它。
我正在考慮是:
- 如果該文件的第一個字節是
{
,嘗試json_decode()
,看它是否失敗。 - 如果該文件的第一個字節是
<
或$
,嘗試include()
,看它是否失敗。 - 如果前三個字節的文件的匹配:[0-9],嘗試
unserialize()
。 - 如果不是前三,儘量
base64_decode()
,看它是否失敗。如果不是:- 檢查解碼數據的第一個字節一次。
- 如果所有這些都失敗了,那就是垃圾。
這似乎只是相當簡單的任務相當昂貴。我能以更好的方式做到嗎?如果是這樣,怎麼樣?
這是一個完美的例子,公約完成這項工作。如果您知道* all * JSON文件以.json結尾,那麼您不需要解析。如果你對環境沒有控制權,那麼運行不可信代碼(使用'include')是相當不安全的。 – rid 2011-05-24 18:43:27
我會讓用戶簡單地指出它是什麼類型的文件,然後理智檢查它。這種自動化的方法似乎有太多的潛力被奇怪的邊緣情況所打擊。 – 2011-05-24 18:43:36
以什麼方式「包含」失敗? – lonesomeday 2011-05-24 18:43:54