2012-03-24 15 views
2

Ich habe eine Funktion, die Benutzereingaben bereinigt. Nachdem die clean-Eingabe zurückgegeben wurde, wird json_decode ($ var, true) durchlaufen; Derzeit erhalte ich einen Fehler bei einer fehlerhaften Zeichenfolge. Obwohl, wenn ich es ausdrucken und mit ihm http://jsonlint.com/ teste, passiert es. Ich habe erkannt, dass die Zeichenfolge nach den Bereinigungsvorgängen 149 Zeichen lang ist und davor ihre 85. Um das zu beheben, habe ich sie auch durch eine Regex laufen lassen, um Sonderzeichen zu entfernen, aber ich denke, das könnte das vorherige rückgängig machen Funktion hat. Funktioniert die Funktion "new" was filer_var macht? Ist dies der beste Weg, Eingaben zu reinigen? Unten ist mein Code:PHP JSON String fehlerhaft

#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

können wir den tatsächlichen Eingang bei jedem Schritt finden Sie? vor dem Reinigen und nach dem Linting? – mpen

+0

Die Ausgabe wurde oben hinzugefügt. –

+0

Was sind die ursprünglichen Post-Werte in Ihrem POST-Array ?. Nebenbei bemerkt haben Sie versucht, HTMLPurifier? http://htmlpurifier.org/ Das ist normalerweise was ich anstelle der eingebauten Filterfunktionen verwende. – Gohn67

Antwort

3

Der Funktionsaufruf filter_var ($ value, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH) eine Ausgabe wie folgt erstellt: {"name":"Pete Johnson","address":"123 mainstreet","email":"[email protected]","password":"PA$$word"}

Deshalb json_decode funktioniert nicht.

Wie ich schon sagte in den Kommentaren. Am besten ist es, json_decode zuerst auf der Eingabe zu verwenden und dann die einzelnen Elemente mit HTML_Purifier und oder Zend_Validator durchzugehen oder eigene zu schreiben, um mit einzelnen Feldern umzugehen. Zum Beispiel hat E-Mail unterschiedliche Validierungsanforderungen als Passwort.

EDIT:

habe ich versucht, durch die neue Funktion ausgeführt wird, aber ich konnte es nicht ist zu arbeiten. Also habe ich ein paar Anpassungen vorgenommen, um es zum Laufen zu bringen. Obwohl ich nicht sicher bin, ob das für deine Regex gedacht war. Hier ist, was ich als Ausgabe aus dem dieser Code bekam:

$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; 

Ausgang: 34name3434PeteJohnson3434address3434123mainstreet3434email3434myemailgmailcom3434password3434PAword34

+0

Wie haben Sie die Zeichenfolge mit den HTML-Nummern gedruckt? –

+0

Ich habe "View Page Source" in Firefox um zu sehen, ob die Werte codiert wurden. Es sollte in Chrome und anderen Browsern funktionieren. Aus irgendeinem Grund Inspect Element mit Firebug zeigte nicht die HTML-codierten Zeichen. – Gohn67