johnhewitt Posted January 12, 2009 Share Posted January 12, 2009 hello again. I am trying to ensure that when a visitor creates a user id that they include at least one number with the letters. i have used eregi but it shows error as true if numbers are used at the begining of string. Obviously where the number id placed wont matter as long as at least one number is used. if (ereg("[^[:alnum:]]",$userid)) $userid_error=true; shows no error without number. very stumped. can you help? thanks in advance Quote Link to comment Share on other sites More sharing options...
jjacquay712 Posted January 12, 2009 Share Posted January 12, 2009 i dont know much regex, but you could try to use count(explode()), and if the number of dimensions in that array is greater than 1, then the user has used a number. Quote Link to comment Share on other sites More sharing options...
johnhewitt Posted January 13, 2009 Author Share Posted January 13, 2009 thanks, but i couldnt get it to work. if (!eregi("^[a-z]+[0-9]+$",$userid)) $userid_error=true; is the closest ive got. however this does show an error when number is placed at begining of string. Ive tried without the begining and end string identifiers but that doesnt work at all. Quote Link to comment Share on other sites More sharing options...
premiso Posted January 13, 2009 Share Posted January 13, 2009 I am not sure if there is a better way to do it, I am sure there is but this would work: preg_match('/(^[0-9]*)/i', $user, $matches); if ($matches[1] != $user) return array(false, "Username must contain at least 1 Numeric (123) character."); Quote Link to comment Share on other sites More sharing options...
johnhewitt Posted January 13, 2009 Author Share Posted January 13, 2009 thanks but again no luck. I did a copy and paste and then also tried altering but no luck. I seems that eregi should do it if only it would allow the number to be anywher on the string. but it only shows tru at beginning or end. Its 1am here in UK i might need to sleep on this one lol thanks for all your input Quote Link to comment Share on other sites More sharing options...
.josh Posted January 13, 2009 Share Posted January 13, 2009 shouldn't use ereg functions, as they will not be part of core build as of php6. if (!preg_match('~^\w*[0-9]\w*$~',$string,$match)) { // incorrect format } note about that regex: you didn't really specify what else was acceptable, beyond requiring at least 1 digit to appear somewhere in the $string. This pattern will match lowercase or uppercase letters, numbers or underscores (_). Pattern will match 0 or more of those, and at least 1 digit. In other words, if someone's name was "8" then it will return true. You didn't specify beyond the 1 digit thing, so there you have it. Quote Link to comment Share on other sites More sharing options...
nrg_alpha Posted January 13, 2009 Share Posted January 13, 2009 if (!preg_match('~^\w*[0-9]\w*$~',$string,$match)) { // incorrect format } Be careful with \w, as this includes an underscore (and I am assuming that the OP is looking only for letters (with at least one number)). Correct me if I'm wrong on that one though. Also note that if just checking to see if a format is there or not, there is no need for the third argument within the preg parameters ($match). Here is my [admittedly] bizarre take: $str = array('passcode','passcode5','pass_8code','Passco9D4e','764243'); foreach($str as $val){ echo (!preg_match('#^(?:[a-z][a-z0-9]*[0-9]+[a-z0-9]*|[0-9][a-z0-9]*[a-z]+[a-z0-9]*)$#i', $val))? $val.'= invalid<br />': $val.'= valid<br />'; } Output: passcode= invalid passcode5= valid pass_8code= invalid Passco9D4e= valid 764243= invalid The logic is using one massive do-not-capture alternation (I realise that in general, alternations are not preferable.. but they do have their occasional uses). So the first part states: [a-z][a-z0-9]*[0-9]+[a-z0-9]* If it starts with a letter [a-z], then it can comprise of letters and/or numbers afterwards [a-z0-9]*, but must contain at least one number [0-9]+ (assuming there might only be letters up to this point) then possibly more letters and/or numbers [a-z0-9]* afterwards, zero or more times... The other half of the alternation is simply the inverse.. if it starts with a number, allow a letters and/or numbers, but must contain at least one letter (assuming there are only numbers up to that point) followed by zero or more letters and/or numbers.. Finally, not sure if upper and lowercase letters are permitted.. so I simply used the i modifier to allow both.. if this is not the case, simply remove the i, and change all the letters within the pattern to the desired case. Quote Link to comment Share on other sites More sharing options...
.josh Posted January 13, 2009 Share Posted January 13, 2009 well if he doesn't want the _ then I would suggest ~^[a-z0-9]*[0-9][a-z0-9]*$~1 Your regex is a whole lot of overkill Quote Link to comment Share on other sites More sharing options...
nrg_alpha Posted January 13, 2009 Share Posted January 13, 2009 well if he doesn't want the _ then I would suggest ~^[a-z0-9]*[0-9][a-z0-9]*$~1 Your regex is a whole lot of overkill The only reason for my overkill solution was to take into account that there must be letters as well as numbers (this may - or may not be an issue with the OP). As it stands, your solution permits only numbers. Again, if this is not an issue, then your solution is great. Quote Link to comment Share on other sites More sharing options...
.josh Posted January 13, 2009 Share Posted January 13, 2009 well your solution permits strings like "a8" or "8a" which is just as arbitrary as my solution. Guess the bottom line is the OP needs to specify :/ Quote Link to comment Share on other sites More sharing options...
johnhewitt Posted January 13, 2009 Author Share Posted January 13, 2009 hi everybody, well the solution that seems to work is: if (!eregi("^[a-z0-9]*[0-9][a-z0-9]*$",$userid)) $userid_error=true; These brings up the error message if no number is included in the ID choice. many thanks to crayon violent!! many thanks everyone for all your help! Quote Link to comment Share on other sites More sharing options...
nrg_alpha Posted January 13, 2009 Share Posted January 13, 2009 As does my code. In any case, as CV mentioned, you should stop using ereg. This is part of POSIX (Portable Operating System Interface -Unix) which is a more gerenalized, portable regex system which as of PHP 6 will no longer be inlcuded in the core. As a result, once your hosting provider switches over to PHP 6 (whenever it is released), and does not have the POSIX extension installed, your ereg code will not work. Future proof your code by learning PCRE (Perl Compatible Regular Expressions). It is more robust than POSIX, and best of all, it is the favored version and quickly becoming the standard. This way, your code won't run the risk of breaking, even when PHP 6 arrives. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.