premiso Posted December 6, 2008 Share Posted December 6, 2008 Hello, I am just looking to see if this is the best way to check a valid username. The requirements I want are in the comment. Any suggestions would be great, thanks! <?php $userArray = array("username", "test1234testsetset", "test-test-3est455test", "#dfdf45-sfdsf", "'sdfsdf+__", "good_username", "bad_username%", "bad123", "good12", "goodgood1234", "goodbad1234", "bad1234", "bad123ba4", "b1c2v3b4n5m6", "toolongofausernameok", "sh", "sht", "bad cause spaces", "bad12345b", "good_but-bad", "gooduser", "frost", "david", "creative210", "12345321"); foreach ($userArray as $user) { if (!validUsername($user)) { echo "BAD: " . $user . "<Br />"; }else { echo "GOOD: " . $user . "<br />"; } } /** * Checks if a username is valid * * Takes in a string of username. If the username is valid * which means that there are no special characters, it has * at least 1 letter, the start of it does not start with a number * and the length is between 4 and 15. And it does not have more than * 4 numbers in it. For every number there must be at least 2 * letters. **/ function validUsername($user) { // first check the length. No need to continue if the length, or first is wrong. $firstNum = substr($user, 0, 1); if ((strlen($user) < 4 || strlen($user) > 15) || is_numeric($firstNum)) return false; $checkNum = preg_replace('/([a-z])*/i', "", $user); if (strlen($checkNum) > 4 || (strlen($checkNum) > 0 && (strlen($user) - strlen($checkNum)) < (strlen($checkNum) * 2))) return false; preg_match('/(^[a-z0-9]*)/i', $user, $matches); if ($matches[1] != $user) return false; return true; } ?> I think it is pretty efficient as is, but yea since I am new the regex part just wanted to check. Thanks! Link to comment https://forums.phpfreaks.com/topic/135838-code-critique-validusername/ Share on other sites More sharing options...
MadTechie Posted December 7, 2008 Share Posted December 7, 2008 Heres an example with error messages to make it more use friendsly <?php $Username = "test"; //Must have atleast 1 number $Username = "1test"; //Must Start with a letter $Username = "test1"; //Username: test1 is Okay $Username = "tes"; //Must Start with a letter //Must have atleast 1 number //Must have twice as many letters to numbers $Username = "te12"; //Must have twice as many letters to numbers $Username = "te12fghdsgfhsdgfsd gfhdsgfhdsgfhsdgfhgdsfjgsdfhsdfgsdhj"; //Must have twice as many letters to numbers $Username = "test 12"; //Must NOT contain special chars //Must have twice as many letters to numbers $error = array(); $letters = strlen(preg_replace('/\d/i', '', $Username)); $numbers = strlen(preg_replace('/[a-z]/i', '', $Username)); $total = $numbers+$letters; if ($Username != preg_replace('/[^\da-z]/i', '', $Username)) { $error[] = "Must NOT contain special chars"; } if (!preg_match('/^[a-z]\w{3}/i', $Username)) { $error[] = "Must Start with a letter"; } if($numbers > 4) { $error[] = "Must have less than 4 numbers"; } if( $numbers < 1) { $error[] = "Must have atleast 1 number"; } if( ($numbers*2) > $letters) { $error[] = "Must have twice as many letters to numbers"; } if( $total > 15 || $total < 4) { $error[] = "Must have twice as many letters to numbers"; } if(count($error)>0) { echo implode($error, "<br>"); }else{ echo "Username: $Username is Okay"; } ?> Hope this helps Link to comment https://forums.phpfreaks.com/topic/135838-code-critique-validusername/#findComment-708185 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.