在PHP中,正则表达式语句始终返回false。
在PHP中,正则表达式语句始终返回false。
我正在尝试检查密码,以确保它们至少包含1个大写字母、1个小写字母和1个数字。我已经查看了相关内容,但无法找到为什么每次都返回false的原因。例如,我输入了Thechedda123,它仍然返回false,并且不会发布到我的数据库。
密码 = $_GET["password"];
正则表达式 = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$";
查询 = "INSERT INTO `users`(`username`, `password`, `school`, `grade`,`email`, `classes`, `firstname`, `lastname`) VALUES ('$username','$password','$school','$grade','$email','$school','$firstname','$firstname')";
如果 (preg_match($regex, $password)){
结果 = mysql_query($query);
如果 (!结果) {
消息 = '无效查询: ' . mysql_error() . "\n";
消息 = '整个查询: ' . $query;
die(消息);
}
} else {
数字 = 'true';
大写 = 'true';
如果 (preg_match($regex, $password)){
数字 = 'false';
}
如果 (preg_match($regex, $password)){
大写 = 'false';
}
echo 大写;
echo 数字;
}
?>
问题:Regex语句在PHP中始终返回false的原因及解决方法
在上述内容中,作者编辑并测试了一个正则表达式(regex)。将你的正则表达式替换为以下内容:
$regex = "/^((?=.*[a-z])(?=.*[A-Z])(?=.*\d))[a-zA-Z\d]{8,}$/";
然后进行测试:
$password_good = "Thecedda123"; // 正确 $password_bad_1 = "hechedda123"; // 缺少大写字母 $password_bad_2 = "TTTTTTTTTT123"; // 缺少小写字母 $password_bad_3 = "Thechedda"; // 缺少数字 $password_bad_4 = "Th123"; // 少于8个字符 $password_bad_5 = "1234567890"; // 缺少字母 // 结果: echo preg_match($regex, $password_good); // true echo preg_match($regex, $password_bad_1); // false echo preg_match($regex, $password_bad_2); // false echo preg_match($regex, $password_bad_3); // false echo preg_match($regex, $password_bad_4); // false echo preg_match($regex, $password_bad_5); // false
即使该正则表达式有效,但它不正确。它必须锚定在起始位置。不需要在前瞻组上使用量词。
好的,我添加了锚点并删除了量词,它也能工作;)
非常感谢!对于晚回复我感到抱歉,我忘记回复了。它非常有效!
文章整理如下:
问题:Regex语句在PHP中始终返回false的原因及解决方法
最近,我在PHP中使用正则表达式时遇到了问题。无论我尝试什么样的正则表达式,它始终返回false。我编辑了我的正则表达式并进行了测试,最后发现了问题所在。
以下是我最初使用的正则表达式:
$regex = "/^((?=.*[a-z])(?=.*[A-Z])(?=.*\d))[a-zA-Z\d]{8,}$/";
我对这个正则表达式进行了一些修改,并进行了测试。下面是我对不同密码进行测试的结果:
$password_good = "Thecedda123"; // 正确 $password_bad_1 = "hechedda123"; // 缺少大写字母 $password_bad_2 = "TTTTTTTTTT123"; // 缺少小写字母 $password_bad_3 = "Thechedda"; // 缺少数字 $password_bad_4 = "Th123"; // 少于8个字符 $password_bad_5 = "1234567890"; // 缺少字母 // 结果: echo preg_match($regex, $password_good); // true echo preg_match($regex, $password_bad_1); // false echo preg_match($regex, $password_bad_2); // false echo preg_match($regex, $password_bad_3); // false echo preg_match($regex, $password_bad_4); // false echo preg_match($regex, $password_bad_5); // false
通过测试,我发现即使这个正则表达式有效,但它不正确。它必须锚定在起始位置,而且不需要在前瞻组上使用量词。因此,我对正则表达式进行了修改,如下所示:
$regex = "/^((?=.*[a-z])(?=.*[A-Z])(?=.*\d))[a-zA-Z\d]{8,}$/";
经过修改后,我再次进行了测试,结果非常满意。现在,正则表达式能够正确地返回true或false。
最后,我想对之前没有及时回复表示歉意,我忘记回复了。非常感谢你的帮助,现在一切都很好!