preg_match()仅检查最后一个字符

时间:2013-12-03 09:28:45

标签: php preg-match

我有以下代码,这使得一些不正确的正则表达式:

$newPw = 'aaaAAAaaA';

$low = preg_match("/^(?:.*[a-z].*[a-z])+$/", $newPw); // at least two lowercases
$up = preg_match("/^(?:.*[A-Z])+$/", $newPw);  // at least one uppercase
$sc = preg_match("/^(?:.*[!@#$%^&*].*[!@#$%^&*])+$/", $newPw);  // at least two special characters


if (!$low) {
    echo 'Password must contain at least two lowercases';
} else if (!$up) {
    echo 'Password must contain at least one uppercase';
} else if (!$sc) {
    echo 'Password must contain at least two special characters';
} else echo 'ok';

问题是我的preg_matches只裁掉了最后一个字符。例如,如果 $ newPw aaA ,它会要求两个lowecases,但是如果 $ newPw aaAa 它要求一个upercase.Both中的两个都错了,我无法确定问题在哪里。

首先,我将所有preg_matches组合在一个大的preg_match中。在我拆分后,它返回错误

已解决这很简单,我感到很惭愧。解决方案是从头开始删除 ^ ,从结尾删除 + $ 每个preg_match。

1 个答案:

答案 0 :(得分:1)

两个小写字符的模式:

  

/.* [A-Z] +。* [A-Z] + /

如果至少有两个小写字母,这将返回整个字符串,但我想这不是问题因为你只检查它是否为真;

问题在于括号后面没有任何量词(+ = 1或更多),因此正则表达式定义被检查的次数不明确([az] lowercahse字符类定义)。外部括号是不必要的,因为我们现在不需要子模式。

至少一个大写字母的模式:

  

/.* [A-Z] +。* /

同样适用,它返回整个字符串,但前提是它至少有一个大写字母。

至少两个特殊字符的模式:

  

/.* [@#$%^&安培;!*] + * [@#$%^&安培;!*]。。+ * /

我喜欢使用此站点预测一些PHP函数(链接到preg_match):

http://www.functions-online.com/preg_match.html

我认为它有时真的很有帮助。 我希望我能帮忙!