0

how to check user enterd password format. string not duplicate and use user must be choose numbers , strings (lowercase/uppercase)

hear is my code. whats my problem in preg_match?

function checkPassFormat($ip)
{
    if(preg_match('/^[a-A][0-9]/', $password))
        return TRUE;
    else 
        return FALSE;
}
DolDurma
  • 15,753
  • 51
  • 198
  • 377

5 Answers5

1

I think this is a cute solution for the issue (you can also collect the errors and show the user a friendly message):

const SECURELEVEL_LOW = 1;
const SECURELEVEL_MEDIUM = 2;
const SECURELEVEL_HIGH = 3;
const SECURELEVEL_SERVICE = 4;

const CONTAINS_LETTERS = 1;
const CONTAINS_DIGITS = 2;
const CONTAINS_CASESENSITIVELETTERS = 4;
const CONTAINS_SPECIALCHARS = 8;

public function _isValid($value) {
    $valid = true;
    switch ($this->_options['secureLevel']) {
      case self::SECURELEVEL_SERVICE:
        $minLength = 20;
        $hasToContain = self::CONTAINS_LETTERS + self::CONTAINS_DIGITS + self::CONTAINS_CASESENSITIVELETTERS + self::CONTAINS_SPECIALCHARS;
        break;
      case self::SECURELEVEL_HIGH:
        $minLength = 8;
        $hasToContain = self::CONTAINS_LETTERS + self::CONTAINS_DIGITS + self::CONTAINS_CASESENSITIVELETTERS;
        break;
      case self::SECURELEVEL_LOW:
        $minLength = 4;
        $hasToContain = 0;
        break;
      case self::SECURELEVEL_MEDIUM:
      default:
        $minLength = 5;
        $hasToContain = self::CONTAINS_LETTERS + self::CONTAINS_DIGITS;
        break;
    }

    if (strlen($value) < $minLength) {
      $valid = false;
    }
    if (strpos($value, ' ') !== false) {
      $valid = false;
    }


    if ($hasToContain & self::CONTAINS_LETTERS) {
      // Password has to contain letters
      if (!preg_match('/[a-z]/i', $value)) {
        $valid = false;
      }
    }

    if ($hasToContain & self::CONTAINS_DIGITS) {
      // Password has to contain numbers
      if (!preg_match('/[0-9]/', $value)) {
        $valid = false;
      }
    }

    if ($hasToContain & self::CONTAINS_CASESENSITIVELETTERS) {
      // Password has to contain small and capital letters
      if (!preg_match('/[a-z]/', $value) || !preg_match('/[A-Z]/', $value)) {
        $valid = false;
      }
    }

    if ($hasToContain & self::CONTAINS_SPECIALCHARS) {
      // Password has to contain a special character
      if (!preg_match('/[^0-9a-zA-Z]/', $value)) {
        $valid = false;
      }
    }

    return $valid;
  }
iRaS
  • 1,958
  • 1
  • 16
  • 29
0

I think [a-A] means that you're only allowing small and capital A. This should probably be [a-zA-Z]. You could also try [a-Z], but in C# for example this doesn't work as expected.

Also you probably need to say "more than one letter followed by more than one number": [a-zA-Z]+[0-9]+. That would allow for passwords like abDCkl98.

If you want to mix letters and numbers, you should do something like [a-zA-Z0-9]+. This is for passwords like a9Bdc4re.

Thorsten Dittmar
  • 55,956
  • 8
  • 91
  • 139
0

Try this:

preg_match("/^[a-zA-Z0-9]+$/", $password)
bear
  • 11,364
  • 26
  • 77
  • 129
0

Following your example, here's another option:

"/[:alpha:][:digit:]/"
Ben
  • 54,723
  • 49
  • 178
  • 224
0
Try out this
$pattern = "/^[a-zA-Z0-9]*$/i";
if(preg_match($pattern, $value)){           
   return true;
}else{
   return false;
}
som
  • 4,650
  • 2
  • 21
  • 36