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


preg_match() checks only last character

我有以下代码,它产生了一些不正确的正则表达式:

$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只检查最后一个字符。例如,如果$newPwaaA,则要求两个小写,但如果$newPwaaAa则要求一个大写。他们两个都错了,我想不出问题出在哪里。

首先,我把所有的preg_match组合在一个大的preg_match中。在我拆分它们之后,它返回了高于的错误

解决了这太简单了,我感到羞愧。解决方案只是从每个preg_match的开始删除^,从结束删除+$

两个小写字符的模式:

/.*[a-z]+.*[a-z]+/

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

问题是括号后面没有任何量词(+=1或更多),所以regex不清楚应该检查类定义多少次([a-z]lowerchase字符类定义)。外括号是不必要的,因为我们现在不需要子模式。

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

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

同样的道理,它返回整个字符串,但前提是其中至少有一个大写字母

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

/.*[!@#$%^&*]+.*[!@#$%^&*]+.*/

我喜欢使用这个网站预测试一些PHP函数(preg_match链接):

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

我觉得有时候真的很有帮助。我希望我能帮上忙!