preg_match只承认两个连续的小写

时间:2013-12-02 11:11:48

标签: php preg-match lowercase

我想检查密码是否包含:

  • 最少2个小案
  • 最少1个大写
  • 至少2个选定的特殊字符

问题在于,当我想验证这一点时,它会允许两个小写,但只有它们是连续的,如下所示: paSWORD 。 如果我输入 pASWORd ,则会返回错误。

这是代码

preg_match("/^(?=.*[a-z]{2})(?=.*[A-Z])(?=.*[_|!|@|#|$|%|^|&|*]{2}).+$/")

我没有看到问题所在以及如何解决问题。

2 个答案:

答案 0 :(得分:2)

您正在寻找正则表达式中的[a-z]{2} 连续两个小写!

我会坚持下去并建议最好在单独的正则表达式中单独检查你的三个条件中的每一个,而不是试图聪明地在一个中进行。

我已经添加了一些额外的括号,其中可能让你的原始想法适用于非连续的小写/特殊字符,但我认为表达式过于复杂。

preg_match("/^(?=(.*[a-z]){2})(?=.*[A-Z])(?=(.*[_!@#$%^&*]){2}).+$/")

答案 1 :(得分:2)

您可以使用此模式检查三个规则:

preg_match("/(?=.*[a-z].*[a-z])(?=.*[A-Z])(?=.*[_!@#$%^&*].*[_!@#$%^&*])/");

但如果您只想允许字母和这些特殊字符,则必须添加:

preg_match("/^(?=.*[a-z].*[a-z])(?=.*[A-Z])(?=.*[_!@#$%^&*].*[_!@#$%^&*])[a-zA-Z_!@#%^&*]+$/");

没有正则表达式的方法

$str = '*MauriceAimeLeJambon*';

$chars = 'abcdefghijklmnopqrtuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_!@#$%^&*';
$state = array('lower' => 2, 'upper' => 1, 'special' => 2);
$strlength = strlen($str);

for ($i=0; $i<$strlength; $i++) {
    $pos = strpos($chars, $str[$i]);
    if (is_numeric($pos)) {
        if     ($state['lower'] && $pos<26) $state['lower']--;
        elseif ($state['upper'] && $pos<52) $state['upper']--;
        elseif ($state['special']) $state['special']--;
    } else { $res = false; break; }
    $res = !$state['lower'] && !$state['upper'] && !$state['special'];
}

var_dump($res);

(此版本提供与第二个模式相同的结果。如果您想要与第一个模式相同的结果,只需删除else {}并将最后一行放在for之外环。)