2010-04-16 4 views
9

Was ist eine effiziente Möglichkeit zu überprüfen, ob ein Benutzername enthält eine Reihe von Sonderzeichen, die ich definiere.PHP Sonderzeichen Test

Beispiele:% # ^. ! @ &() +/"` ~ <> {} [] | = -;?.

ich sie erkennen muß, und gibt einen boolean, nicht nur sie Streifen aus

Wahrscheinlich Frage einer super einfach, aber Ich brauche eine bessere Möglichkeit, dies als eine große Liste von Bedingungen oder eine schlampige Schleife zu tun.

Antwort

9

Je besser ist, um zu bestimmen, ob es irgendwelche Zeichen, die nicht in einer Liste der zugelassenen sind, wie:

preg_match('![^a-z0-9]!i', $nickname); 
+3

+1: Whitelists sind ein besseres Sicherheitswerkzeug als Blacklists. –

+0

Danke! Entschuldige meine Unerfahrenheit mit Regex, aber wie kann ich auch Unterstriche zulassen? – pws5068

+0

einfach _ nach char '9' hinzufügen – zerkms

3

Mit regulären Ausdrücken bedeutet die \ w Sonderzeichen "beliebige Wort Zeichen" und die \ d bedeutet Ziffern. Das^in den Klammern bedeutet negieren oder im Grunde alles, was nicht in den Klammern steht. Der folgende Code würde echo "wahr" oder eine 1, um anzuzeigen, dass die Zeichenfolge Nicht-Wort-Zeichen enthält.

$string = '% #^. ! @ & () +/" ? ` ~ < > { } [ ] | = - ;' 
echo preg_match('~[^\w\d]~', $string); 
+0

versuchen, die Faust zu sein - Sie haben vergessen, dass Strings mit Anführungszeichen einschränken ;-) – zerkms

+0

Yeah, habe ich das gefangen. ;) –

3

Regex ist in der Regel die Möglichkeit zum Testen eines zulässigen Bereichs zu gehen, insbesondere alphanumerische Einheiten wie Benutzernamen wenn die Menge der nicht erlaubte Zeichen ist jedoch klein und/oder nicht-sequenziellen (das heißt, nicht ohne weiteres mit spezifizierten Bereiche) können Sie eine bessere Leistung mit diesem erhalten:

strspn($string,'%#^[email protected]&()+/"?`~<>{}[]|=-'); 

Dadurch wird die Länge des ersten Teilkette zurück gefunden das besteht nur aus den unzulässigen Zeichen (die 0 sind, wenn keine unzulässigen Zeichen vorhanden sind).

2

Sie können so etwas wie die folgenden zählen, um die Anzahl, wie oft ein Zeichen aus einer gegebenen Menge von Zeichen erscheint innerhalb einer Zeichenkette verwenden:

<?php 

/** 
* Count the number of times any char from $char is found in $search 
* @param $search Looks for the chars here 
* @param $chars The chars to look for 
* @return int 
*/ 
function countChars($search, $chars) 
{ 
    $chars = str_replace(
     array("\\", '[', ']', '^', '-'), 
     array("\\\\", '\[', '\]', '\^', '\-'), $chars); 

    $results = array(); 
    preg_match_all("/[$chars]/", $search, $results, PREG_SET_ORDER); 
    return count($results); 
} 

var_dump(countChars("Hello, World", "ol")); 
var_dump(countChars("Lorem ipsum...", ".m")); // searches for . and m only 
var_dump(countChars("^[]-^\\*", "^[]-\\")); 

Hoffnung, das hilft.