正则表达式,定义一个具有不同数量的三个不同字符组的字符串

时间:2014-05-14 14:21:14

标签: php regex

我在PHP中为preg_match($pattern, $password)函数创建$模式,它应该是一个以这种方式定义字符串的正则表达式:

  • 至少$str_lenght长AND
  • 至少有$num_capitals个大写字母AND
  • 至少有$num_numerals个数字和
  • 在此范围内至少$num_symbols:!@#$%^& *() - +?

我该怎么做?

3 个答案:

答案 0 :(得分:3)

您可以使用lookaheads以这种方式构建正则表达式:

$re = '/(?=(.*?[A-Z]){' . $num_capitals . '})(?=(.*?[0-9]){' . $num_numerals . 
      '})(?=(.*?[!@#$%^&*()+?-]){' . $num_symbols . '}).{' . $str_lenght . ',}/';

答案 1 :(得分:1)

@anubhava极大地摧毁了我的答案,但我会留下它以换取其他方法

.匹配所有字符,{5,}重复5次以上。但是,由于我们没有制作一个长表达式,我仍然会使用更快的strlen()Demo

.{5,}

对于其余的,我会匹配一个字符类并使用preg_match_all()来返回匹配的总数(可能是0)。

以下是您想要的3个字符类:

[A-Z]
[0-9] OR \d (\d will match other numeric characters, like Arabic, etc.)
[!@#$%^&*()+?-]

示例实现:

$count = preg_match_all('/[A-Z]/', 'FOObar', $matches);
// $count = 3;

请注意,在最后一个字符类([!@#$%^&*()+?-])中,^不得先出现,而-不得位于中间位置。否则您需要逃脱他们与\因为具有特殊意义。

答案 2 :(得分:0)

试试这个

 $strRegex = '/((?=.*\d).{'.$num_numerals.'})((?=.*[a-z]).{'.$num_lower.'})((?=.*[A-Z]).{'$num_upper'})((?=.*[@#$%]).{'.$num_symbols.'})/';

$strRegex = '/((?=.*\d).{'.$num_numerals.'})((?=.*[a-z]).{1,'.$num_lower.'})((?=.*[A-Z]).{'$num_upper'})((?=.*[@#$%]).{'.$num_symbols.'})/';

基于$ num_lower,您可以限制密码中允许的字符数。 传递将接受从1到$ num_lower

的小写