php + javascript字符串检查

I have a string that is failing to pass the below requirement:-

$uid = ca11a15e (the value called from database)

function _checkSn($uid)    
{
   $match1 = preg_match('/^p[a-z\d][a-z\d][1-6][a-z]\d{2}e$/',$uid);
   $match2 = preg_match('/^p[a-z\d][a-z\d]school$/',$uid);
   $match3 = preg_match('/^p[a-z\d][a-z\d]master$/',$uid);
   $match4 = preg_match('/^p[a-z\d][a-z\d]ee01$/',$uid);
   $doesMatch = ($match1 || $match2 || $match3 || $match4);
   return $doesMatch; 
}

Actually, what is the phase talking about? and how shall I modify it so that the $uid can pass the checking?

return (preg_match('/^p[a-z\d][a-z\d][1-6][a-z]\d{2}e$/',$uid) 
|| preg_match('/^p[a-z\d][a-z\d]school$/',$uid) 
|| preg_match('/^p[a-z\d][a-z\d]master$/',$uid) 
|| preg_match('/^p[a-z\d][a-z\d]ee01$/',$uid));

uid matches the pattern if it is...

  • "p", two times either a lowercase letter or digit, followed by
  • one digit 1-6, another letter, two digits, "e" or "school" or "master" or "ee01"

For example, this would match: "p6t3h56e" (first pattern), or "p9hschool" (second).

"ca11a15e" will not match any of these because they all require a "p" at the start.

By the way, this can be shortened to:

return (preg_match('/^p[a-z\d]{2}([1-6][a-z]\d{2}e|school|master|ee01)$/',$uid);

Are all the uid's going to start with a c? Maybe you meant this, which would match "ca11a15e" (Note the c instead of p):

return (preg_match('/^c[a-z\d]{2}([1-6][a-z]\d{2}e|school|master|ee01)$/',$uid);

Short answer

Your uid does not begin with a 'p'. All rules are checking that it begins with 'p'.

Long answer

$match1 = preg_match('/^p[a-z\d][a-z\d][1-6][a-z]\d{2}e$/',$uid);

This is checking for something of the format: the letter p, lowercase letter, 1 digit number, lowercase letter, 1 digit number, number from 1 to 6, lowercase letter, number (1 or 2 digits), the letter e

$match2 = preg_match('/^p[a-z\d][a-z\d]school$/',$uid);

This is checking for something of the format: the letter p, lowercase letter, 1 digit number, lowercase letter, 1 digit number, the word 'school'

$match3 = preg_match('/^p[a-z\d][a-z\d]master$/',$uid);

This is checking for something of the format: the letter p, lowercase letter, 1 digit number, lowercase letter, 1 digit number, the word 'master'

$match4 = preg_match('/^p[a-z\d][a-z\d]ee01$/',$uid);

This is checking for something of the format: the letter p, lowercase letter, 1 digit number, lowercase letter, 1 digit number, the string 'ee01'

EDIT

If you wish to add 'c' to the allowed characters at the start of the matching, you can, for example do:

$match1 = preg_match('/^[cp][a-z\d][a-z\d][1-6][a-z]\d{2}e$/',$uid);

[cp] instead of p checks for EITHER c or p as the first letter.