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

Php preg_match()只检查最后一个字符,php,preg-match,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("/^(?:.*[!@#$%^&*].*[!@#$%^&a

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

$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_只匹配最后一个字符。例如,如果$newPwaaA它要求两个小写,但是如果$newPwaaAa它要求一个大写。这两个都是错误的,我不知道问题出在哪里

首先,我把所有的preg_比赛合并在一个大的preg_比赛中。在我分割它们之后,它返回上面的错误


解决了这太简单了,我感到很惭愧。解决方法就是从每个preg\u匹配的开头删除^,从结尾删除+$

两个小写字符的模式:

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

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

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

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

/.*[A-Z]+*/

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

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

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

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

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

^.*(?=.{4,10})(?=.*\d)(?=.[a-zA-Z]).*$
?它检查整个字符串,但从开始处删除^end@JoniSalmi哦..太简单了…我太傻了。所以答案就是删除^and+$,效果很好。作为一个方面,你对密码的要求越严格(除了长度)暴力越容易。@AdiCrainic:请不要在问题标题中添加“已解决”。如果其中一个答案帮助您解决了问题,请单击左侧空白处的复选标记。如果没有一个答案是有用的,而你找到了自己的解决方案,那么就发布你自己的答案并接受它。