2012-03-24 135 views
2

我有一個清理用戶輸入的函數。清潔輸入返回後,它通過json_decode($ var,true);目前,我收到錯誤的字符串錯誤。雖然,如果我打印出來並用http://jsonlint.com/進行測試,它會通過。我已經意識到,清理過程之後的字符串是149個字符長,之前是85個。爲了解決這個問題,我還通過一個正則表達式來刪除特殊字符,但我認爲這可能會取消之前的功能確實。 「new」函數是否取消了filer_var的作用?這是清理輸入的最佳方式嗎?下面是我的代碼:PHP JSON字符串格式錯誤

#index.php 
$cleanInput = cleanse->cleanInput($_POST); 

#cleanse.php OLD 
function cleanInput($input){ 
    foreach($input as $key => $value){ 
    $cleanInput[$key] = filter_var($value, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH)); 
    } 

    return($cleanInput); //Returns 149char long string, visually 85chars 
} 


#cleanse.php NEW 
function cleanInput($input){ 
    foreach($input as $key => $value){ 
    $cleanInput[$key] = preg_replace("[^+A-Za-z0-9]", "", filter_var($value, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH))); 
    } 

    return($cleanInput); //Returns 85char long string, visually 85chars 
} 

#outputs 
    #Before 
    {"name":"Pete Johnson","address":"123 main street","email":"[email protected]","password":"PA$$word"} 

    #After 
    {"name":"Pete Johnson","address":"123 main street","email":"[email protected]","password":"PA$$word"} 
+0

我們可以看到實際輸入的每一步嗎?清潔之前和之後? – mpen 2012-03-24 17:08:24

+0

上面增加了輸出。 – 2012-03-24 17:14:32

+0

什麼是您的POST數組中的原始帖子值?在附註中您是否嘗試過HTMLPurifier? http://htmlpurifier.org/這通常是我使用,而不是內置的過濾器功能。 – Gohn67 2012-03-24 17:31:30

回答

3

的函數調用filter_var($值,FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_HIGH)創建一個輸出這樣的: {"name":"Pete Johnson","address":"123 mainstreet","email":"[email protected]","password":"PA$$word"}

這就是爲什麼json_decode不起作用。

就像我在評論中所說的。最好的辦法是先對輸入使用json_decode,然後使用HTML_Purifier和/或Zend_Validator運行各個元素,或編寫自己的處理單個字段。例如,電子郵件的驗證要求與密碼不同。

編輯:

我試圖通過新的功能運行,但我無法得到它的工作是。所以我做了一些調整以使其起作用。雖然我不確定這是否是你想要的正則表達式。下面是我從這段代碼的輸出:

$input = '{"name":"Pete Johnson","address":"123 main street","email":"[email protected]","password":"PA$$word"}'; 
$cleanedInput = preg_replace("/[^+A-Za-z0-9]/", "", filter_var($input, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH)); 
echo $cleanedInput; 

輸出: 34name3434PeteJohnson3434address3434123mainstreet3434email3434myemailgmailcom3434password3434PAword34

+0

你是如何用html數字打印字符串的? – 2012-03-24 19:33:06

+0

我在Firefox中查看了頁面源代碼,看看這些值是否被編碼。它應該在Chrome和其他瀏覽器中工作。由於某些原因檢查與螢火蟲元素沒有顯示HTML編碼的字符。 – Gohn67 2012-03-24 19:39:25