1

好的,所以我正在开发一个登录系统,并且我正在努力阻止我不想要的用户输入,我的部分验证是确定用户名只有字母数字,以及密码,以及一个单独的验证电子邮件。因此,我在 php.net 上找到了几个可以使用的示例,因为在 php 中的所有内容中,这些 preg 匹配的东西对我来说几乎没有任何意义。

我遇到的问题是误报。前两个在 true 时返回 false,并且电子邮件验证按预期工作,但对于我的生活,我不知道为什么。我可以简单地删除!在前面强制我对表达式的预期答案,但我实际上想知道为什么两个结构几乎完全相同的语句返回不同的布尔值。

<?php
$user = "testing2";
$pass = "testing1";
$email = "testing@gmail.com";
    if (!preg_match('/[^A-Za-z0-9]+/', $user)) {
        echo "Username must only contain English letters and numbers<br />";
    }
    if (!preg_match('/[^A-Za-z0-9]+/', $pass)) {
        echo "passw must only contain English letters and numbers<br />";
    }
    if (!preg_match('/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])*(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*$/i', $email)) { 
        echo "Please use a valid email"; 
    }
?>
4

2 回答 2

2

因为你有一个用户名和密码的否定字符类,你应该删除条件的否定:

if (preg_match('/[^A-Za-z0-9]/', $user)) { ... }

上面的意思是“如果$user包含任何不是字母数字的字符”,所以似乎是您要警告的内容。换句话说,您的前 2 个正则表达式实际上是在寻找无效值。

混淆可能是由于^前两个正则表达式中的字符类被用于否定字符类,但在电子邮件正则表达式中被用作锚点(字符串的开头)。

另一种方法是使前 2 个正则表达式与最后一个一致,并让它们只查找有效值:

if (!preg_match('/^[A-Za-z0-9]+$/', $user)) { ... }

以上确保 的每个字符$user都是字母数字。

于 2013-09-25T16:28:01.290 回答
0

你可以做两种不同的事情:

寻找正确的格式;如果不是,则字符串只是字母数字字符

if (!preg_match('/[A-Za-z0-9]+/', $user)) 

寻找不正确的格式;如果字符串包含非字母数字字符

if (preg_match('/[^A-Za-z0-9]/', $user))

你把它们都混在一起了!

于 2013-09-25T16:33:49.337 回答