2016-09-24 3 views
1

Ich versuche, erlaubte Zeichen in einem Array zu definieren und dann Strings basierend auf diesem Array zu bereinigen. Der folgende Code funktioniert ziemlich gut, außer dass er auch die Zeichen 0-9 entfernt!PHP - Sanitize string entfernt Zahlen

Könnte jemand bitte erklären, warum das so ist?

Code:

<?php 

//Allowed characters within user data: 
$symbols = array(); 
$symbols += range('a', 'z'); 
$symbols += range('A', 'Z'); 
$symbols += range('0', '9'); 
array_push($symbols,' ','-'); // Allow spaces and hyphens. 

//----test 1 

//data to test. 
$someString = "07mm04dd1776yyyy"; 

//sanatize 
$someString = trim(preg_replace("/[^" . preg_quote(implode('',$symbols), '/') . "]/i", "", $someString)); 

echo "$someString\n"; 

//----test 2 
$someString = "Another-07/04/[email protected]#$%^&*()[]\\;',./\"[]|;\"<>?"; 

//sanatize 
$someString = trim(preg_replace("/[^" . preg_quote(implode('',$symbols), '/') . "]/i", "", $someString)); 

echo "$someString\n"; 

?> 

Ausgang:

mmddyyyy 
Another--test- 

Nebenbei bemerkt (edit): Diese in Verbindung mit einer Datenbank verwendet wird, aber es geht über die DB werden die Daten in der DB genutzt Schreibe Powershell-Skripte, die Benutzer in Active Directory importieren, und viele Zeichen sind nicht erlaubt, und das alte System erlaubt nur diese Zeichen auch.

Danke im Voraus, Wayne

+0

Nebenbei bemerkt: Hat das irgendetwas hat durch Zufall mit einer Datenbank zu tun? Wenn ja, brauchst du das alles nicht. Sie können eine vorbereitete Anweisung verwenden. –

+0

Es tut, aber es geht über die DB, die Daten in der DB wird verwendet, um Powershell-Skripte zu schreiben, die Benutzer in Active Directory importieren, und viele Zeichen sind nicht erlaubt, und das alte System erlaubte nur diese Zeichen auch. –

+0

Ok. Ich habe deinen Kommentar als Bearbeitung hinzugefügt, wenn es dir nichts ausmacht. Es könnte sich auf das Ergebnis möglicher Antworten auswirken. –

Antwort

0

off gehen, was @andrewsi mit den erlaubten Zeichen sagte nicht zu dem Array hinzugefügt wird, habe ich herausgefunden, wie man sich richtig hinzuzufügen. Der folgende Code zeigt, dass sie hinzugefügt werden, und die Ausgaben der Testzeichenfolgen.

Es gibt wahrscheinlich einen besseren Weg, dies zu tun, also habe ich es zum Community-Wiki hinzugefügt.

<?php 

//Allowed characters within user data: 
$symbols = array(); 
array_push($symbols,implode("",range('0', '9'))); 
array_push($symbols,implode("",range('a', 'z'))); 
array_push($symbols,implode("",range('A', 'Z'))); 
array_push($symbols,' ','-'); // Allow spaces and hyphens. 

print_r($symbols); 
echo "\n"; 

//----test 1 

//data to test. 
$someString = "07mm04dd1776yyyy"; 

//sanatize 
$someString = trim(preg_replace("/[^" . preg_quote(implode('',$symbols), '/') . "]/", "", $someString)); 

echo "$someString\n"; 

//----test 2 
$someString = "Another-07/04/[email protected]#$%^&*()[]\\;',./\"[]|;\"<>?"; 

//sanatize 
$someString = trim(preg_replace("/[^" . preg_quote(implode('',$symbols), '/') . "]/", "", $someString)); 

echo "$someString\n"; 

?> 

Ausgang:

Array 
(
    [0] =>
    [1] => abcdefghijklmnopqrstuvwxyz 
    [2] => ABCDEFGHIJKLMNOPQRSTUVWXYZ 
    [3] => 
    [4] => - 
) 

07mm04dd1776yyyy 
Another-07041776-test- 
+0

Ich bin neugierig, warum Sie nicht Metazeichen verwenden wie 'preg_replace ('/ [^ a-zA-Z \ d-] /', '');' Dies ersetzt alle Sonderzeichen außer Bindestrich und Leerzeichen. Beispiel: http://ideone.com/ngOrjQ Ich habe auch einige andere Sonderzeichen hinzugefügt. Sie müssen also 'array_push' nicht verwenden, verwenden Sie einfach' $ array [] = $ value' wie folgt: http://ideone.com/R9VK00 – fyrye

+0

@fyrye Weil ich immer noch PHP lerne und weil ich verstehe nicht alle Zeichen, die du in diese preg_replace-Anweisung geschrieben hast, und die Art, wie ich sie oben geschrieben habe, ergibt für mich Sinn und ist für mich leicht zu verstehen. –

+0

Die Metazeichen können nachgeschlagen werden und sind Standard für alle Programmiersprachen, die reguläre Ausdrücke verwenden. https://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php.So bedeutet der Ausdruck, den ich geschrieben habe: '[^]' bedeutet Muster, die nicht übereinstimmen, 'az' sind Kleinbuchstaben a bis z,' AZ' sind Großbuchstaben A bis Z, '\ d' sind beliebige Ziffern (wie 9), und das ist es ziemlich abgesehen von der wörtlichen '-' und' '(Leerzeichen nicht das gleiche wie' \ s'). Effektiv das gleiche wie die Arrays, die Sie geschrieben haben. – fyrye